Java基础-泛形

第一百零四期:搞清这些陷阱,NULL和三值逻辑再也不作妖 NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。 作者:youzhibing2904 NULL NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没... 阅读详情

Java中的泛型

为什么需要泛型

  • 通过以下两段代码就可知我们为什么需要泛型:
public int  add(int a, int b){
	return a+b;
}
public float  add(float a, float b){
	return a+b;
}

实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求和,需要重新在重载一个输入是double类型的add方法。

在这里插入图片描述

定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现

使用泛型的好处

  • 适用于多种数据类型执行相同的代码
  • 泛型中的类型在使用时指定,不需要强制类型转换

泛型类和泛型接口的定义

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?

顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

引入一个类型变量T(其他大写字母都可以,不过常用的就是T,E,K,V等等),并且用<>括起来,并放在类名的后面。泛型类是允许有多个类型变量的。

/*
* 泛型接口
**/
public interface Genertor<T> {
    public T next();
}
/*
* 类说明:泛型类
 */
public class NormalGeneric<K> {
    private K data;

    public NormalGeneric() {
    }

    public NormalGeneric(K data) {
        this.data = data;
    }

    public K getData() {
        return data;
    }

    public void setData(K data) {
        this.data = data;
    }

    public static void main(String[] args) {
        NormalGeneric<String> normalGeneric = new NormalGeneric<>();
        normalGeneric.setData("OK");
        //normalGeneric.setData(1);
        System.out.println(normalGeneric.getData());
        NormalGeneric normalGeneric1 = new NormalGeneric();
        normalGeneric1.setData(1);
        normalGeneric1.setData("dsf");
    }
}

/*
* 类说明:泛型类
 */
public class NormalGeneric2<T,K> {
    private T data;
    private K result;

    public NormalGeneric2() {
    }

    public NormalGeneric2(T data) {
        this();
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public NormalGeneric2(T data, K result) {
        this.data = data;
        this.result = result;
    }

    public K getResult() {
        return result;
    }

    public void setResult(K result) {
        this.result = result;
    }

    public static void main(String[] args) {
        NormalGeneric2<String,Integer> normalGeneric2 = new 				NormalGeneric2<>();
        normalGeneric2.setData("OK");
        System.out.println(normalGeneric2.getData());
        normalGeneric2.setResult(23);
        System.out.println(normalGeneric2.getResult());

    }
}

泛型方法的定义

泛型方法,是在调用方法的时候指明泛型的具体类型 ,泛型方法可以在任何地方和任何场景中使用,包括普通类和泛型类。注意泛型类中定义的普通方法和泛型方法的区别

public class GenericMethod {
	/*
	泛型方法
	*/
    public <T> T genericMethod(T...a){
        return a[a.length/2];
    }

    public void test(int x,int y){
        System.out.println(x+y);
    }

    public static void main(String[] args) {
        GenericMethod genericMethod = new GenericMethod();
        genericMethod.test(23,343);
        System.out.println(genericMethod.<String>genericMethod("mark","av","lance"));
        System.out.println(genericMethod.genericMethod(12,34));
    }
}

限定类型变量

有时候,我们需要对类型变量加以约束,比如计算两个变量的最小,最大值。

public static<T> T min(T a, T b){
	if (a.compareTo(b) > 0){
		return a;
	} else {
		return b;
	}
}

请问,如果确保传入的两个变量一定有compareTo方法?那么解决这个问题的方案就是将T限制为实现了接口Comparable的类

public static<T extends Comparable> T min(T a, T b){
	if (a.compareTo(b) > 0){
		return a;
	} else {
		return b;
	}
}

T extends Comparable中
T表示应该绑定类型的子类型,Comparable表示绑定类型,子类型和绑定类型可以是类也可以是接口。
如果这个时候,我们试图传入一个没有实现接口Comparable的类的实例,将会发生编译错误。

在这里插入图片描述

泛型中的约束和局限性

  • 不能用基本类型实例化类型参数
  • 运行时类型查询只适用于原始类型
  • 泛型类的静态上下文类型变量失效
  • 不能创建参数化类型的实例
  • 不能捕获泛型类的实例

泛型类型的继承规则

现有一个类与其子类

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String firstName) {
        this.name = name;
    }
}
public class Man extends Person {
}

有一个泛型类

public class H<T> {}

问:H<Person> 和 H<Man> 是继承关系吗?

答:他们之间没有任何关系

通配符类型

三种方式

  • <?>被称作无限定的通配符
  • <? extends X >表示类型的上界,类型参数是X的子类
  • <?super X> 表示类型的下界,类型参数表示X的超类
TypeScript(三)对象类型 在TS中除了之前的基本类型外,还包含Array(数组),Object(对象),Function(函数)等等继承于对象的其他对象,以及Tuple(元组),Enum(枚举)等高级类型,以及泛型,never,unknown类型。这些类型是TS强类型检查的基础Array(数组)Object(对象)Function(函数)Tuple(元组)Enum(枚举)泛型neverunknownTypeScript 入门教程TypeScript: Documentation - 基础 阅读详情

相关推荐

TypeScript String 类型深入解析

在 TypeScript 中,String类型是用于表示文本值的。与 JavaScript 中的字符串相同,TypeScript 中的字符串是由 Unicode 字符序列组成的,可以使用单引号()、双引号()或反引号(``)来表示。

lsx202406的博客 520

java的八大基本类型和类型之间的转换

一、java的八大基本类型 四类: **1、整形** 类型 大小 范围 byte(字节类型) 1字节 -2^7 ~ 2^7-1 short(短整形) 2字节 -2^15 ~ 2^15-1 int(整形) 4字节 -2^31 ~ 2^31-1 long(长整型) 8字节 -2^63 ~ 2^63-1 **2、浮点型** 类型 大小 范围 float(单精度浮点数) 4字节 -2^128 ~ 2^128 double(双精度浮点数) 8字节 -2^102

qq_40226268的博客 1777

Java实验(超详细)

使用JDK和MyEclipse编译Java Applet,并建立HTML文档运行该Applet.打包mypackage,并压缩生成".jar"文件。记录操作过程。 输出下列数字形式。 ①n=4 0 0 0 0 0 1 1 1 0 1 2 2 0 1 2 3 ② n=4 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 采用一维数组输出等腰三角形的杨辉三角。 求二维数组的鞍点,即该位置上的元素在该行上最大

Mr_wang的博客 1303

Golang检查变量类型的几种方法

Go提供几种方法检查变量的类型,在字符串格式化标识%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind,另外还有使用类型断言,switch case方式。下面通过实例分别介绍这四类方法。使用%T字符串格式化标识是最简单的检查类型方式。%T是fmt包,可以使用fmt.Printf显示变量类型: 使用reflect包函数 如果上述方法没有用,或希望获得类型的更多信息,可以使用reflect包的TypeOf和ValueOf().Kind函数。如果给TypeOf方法传入变量值,

neweastsun的专栏 8166

5G边缘计算:核心网下沉革命

5G核心网与边缘计算的深度融合,通过UPF下沉、本地流量卸载等关键技术,实现了低时延、高效能的分布式计算架构。该技术将数据处理从核心网向边缘节点转移,支持工业控制、车联网、远程医疗等场景的1-10ms超低时延需求。5G核心网的SBA架构和CUPS设计为边缘计算提供了灵活部署基础,SMF、PCF等网元协同确保业务质量与可靠性。

Qinti_mm的博客 1402

黑马Java第二阶段:JavaWeb(笔记)

黑马Java第二阶段:JavaWeb(笔记)

chen的博客 5661

java泛形的一个转换问题

weixin_42217229的博客 624

【Oracle数据库】Oracle11g数据库下载与安装教程(超详细安装图解)

Oracle11g是Oracle公司出的一个比较轻量版的数据库,这里重点说一下在window系统上如何安装Oracle11g, Oracle11g是很早之前的安装包,win7 系统安装时不会遇到环境不满足最低要求的提示,win11系统安装时会提醒环境不满足,修改配置文件即可(注意:先安装oracle服务端/oracle客户端,再安装第三方工具(PL/ SQL Developer,DBeaver等)服务器端环境概述:ORACLE数据库版本:Oracle 11g 64位(11.2.0)

qq_34463511的博客 1万+

java泛形总结

2019-02-21持续更新

guoyajie66的博客 197

识别产品外观的合格软件_工业视觉工业质检视觉识别机器视觉视觉检测智能制造工业检测缺陷...

随着工业物联网技术的迅猛发展,掀起了以云计算、大数据、以及人工智能 AI 等信息技术正与传统工业深入融合,由此衍生的 “智能制造4.0” 理念,正在为全球工业带来深远变革。中国的制造业巨头也纷纷借此发力,向智能化、数字化制造演进,实施战略转型。如何高效科学的管理和分析制造业务链上的生产价值,推进制造企业生产工艺优化与产品质量提升是每一个制造企业在数字化、智能化转型过程中的必经之路。业务发展带来的挑...

weixin_42502419的博客 752

[TI板]MSPM0G3507——keil环境配置+烧录配置+vscode配置+空工程迁移+点灯+芯片解锁教程

本文介绍了MSPM0G3507开发环境的配置与烧录方法。主要内容包括:1)下载安装芯片支持包和SDK开发工具;2)通过串口或DAPLink两种方式实现程序烧录,详细说明了UniFlash软件的使用步骤和常见问题解决方法;3)简要提及工程迁移和LED点灯等基础操作。文章提供了完整的开发环境搭建指南,涵盖从软件安装到实际烧录的全过程,并附有相关工具下载链接和操作截图,帮助开发者快速上手MSPM0G3507开发。

qq_23220445的博客 1万+

java泛形

java泛形

weixin_44852686的博客 91

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1052

Java泛形

JAVA范型使用并不“难“,但是却非常重要。充斥着各种框架代码逻辑。内部深层次逻辑可谓十分恶心,甚至被各位大牛批评。 范型类 public class Box&amp;amp;lt;T&amp;amp;gt; { // T stands for &amp;quot;Type&amp;quot; private T t; public void set(T t) { this.t = t; } public T get() {...

define_us的专栏 479

复现论文报错解决

博主复现论文代码过程中遇到的各种报错及解决方案~

rellvera的博客 1060

FANUC机器人_KAREL编程入门学习(1)

FANUC机器人_KAREL编程入门学习(1)

Robot_PLC_HMI_Automation 6421

java的泛_java-泛形使用

1.类,方法上的泛形//泛型类定义的泛型,在整个类中有效。如果被方法使用,//那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。////为了让不同方法可以操作不同类型,而且类型还不确定。//那么可以将泛型定义在方法上。/*特殊之处:静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。*/class Demo{public void ...

weixin_32417571的博客 148

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java接口,集合框架,泛形。

//java接口 //接口不同于类,但是可以被继承,接口的声明是可以包含属性和方法,属性只能是final和sttic,方法只能是抽象的方法,不能有构造方法,一个接口有可有多个方法,接口保存在以接口名为文件名的java文件中。 //接口的声明 import java lang, public interface  nameofinterface { //任何形式的final.static

燃的博客 502

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

自定义泛形

方法使用泛形前,必须对泛形进行声明,语法:<T>,T可以是任意字母,但通常必须要大写。此种形式下需要注意的是:由于print方法c参数的类型为Collection<?>,即表示一种不确定的类型,因此在方法体内不能调用与类型相关的方法,例如add()方法。问题:该方法只能打印保存了Object对象的集合,不能打印其它集合。通配符,就只能调对象与类型无关的方法,不能调用对象与类型有关的方法。编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。注意,静态方法不能使用类定义的泛形,而应单独定义泛形。

a18007931080的博客 451

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

泛形-->总结

1、泛形的作用:JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。 代码说明: (1) List list=new ArrayList(); list.add("abc"); //String类型不能强转成Integer类型,编译时...

diaoyinji6441的博客 108

java的泛_java泛型(泛形)

package com.lan.generic;import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Set;import org.junit.Test;public...

weixin_39550258的博客 91

泛形和枚举

泛型定义泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。兼容版本java 1.5解决什么问题Java语言引入泛型的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实

vhawk的专栏 775

java反射-泛形

转自:https://www.jianshu.com/p/7cc6921c3be4 一、泛型和Class类 从JDK 1.5 后,Java中引入泛型机制,Class 类也增加了泛型功能,从而允许使用泛型来限制Class类。 例如:String.class 的类型实际上是Class<String>。如果Class对应的类暂时未知,则使用Class<?>(?是通配符)。通过在反射中使用泛型,可以避免使用反射生成的对象需要强制类型转换。 泛型的好处众多,最主要的一点就是避免类型转换,

maoyeqiu的专栏 279
上一篇: Android优化之数据结构优化
下一篇: Android学习笔记链接
hjdudu
博客等级 码龄10年 4粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值