Java泛型

泛型


1. 什么是泛型

在推出泛型之前,程序员通过构建元素类型为Object的集合,存储多个任意类型的数据对象;在使用该对象的过程中,程序员需要明确知道存储每个元素的数据类型(几乎不可能),否则会引发ClassCastException。

显然,类型的优点: 在不知道集合存储类型的前提下,泛型能够统一集合的元素类型——类型安全消除通过Object集合带来的强制类型转换

泛型的本质就是参数化类型,将所操作的数据类型指定为一个参数,实现动态更改。

2. 泛型类、接口

定义语法

class 类名<泛型标识,泛型标识,...>{
	private 泛型标识 变量名;
}

常用的泛型标识:

? 表示不确定的java类型
T (type) 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element

如果泛型类在new的时候没有指定泛型类型,将默认使用Object来操作。

泛型类型不支持基本类型。

同一个泛型类,不同的泛型参数,本质上还是同一类型=>泛型类本身

// intGeneric是<Integer>,strGeneric是<String>
System.out.println(intGeneric.getClass()==strGenenric.getClass())  // true
// intGeneric.getClass()  ==>Generic

因此可知

指定泛型类型,不支持多态

指定泛型类型,不支持重载

如果使用泛型通配符,支持重载和多态


从泛型类派生子类

子类也是泛型类,则子类泛型标识至少要包含父类的泛型标识

子类不是泛型类,则父类的泛型类型需要显式声明 此时子类使用父类的方法,方法的返回值都会变成明确的类型

接口

实现类的实现规则跟派生子类的规则一致。

3. 泛型方法

定义格式

修饰符 <T,E,...> 返回值类型 方法名(形参){}
  • 修饰符与返回值中间的<T>非常重要,可以理解为声明该方法为泛型方法
  • 只有声明了<T>的方法才是泛型方法,泛型类中使用了泛型的成员方法不是泛型方法
  • <T>相当于声明,该方法中要使用泛型T

实例: 传入一个T类型的集合,随机返回一个T

public <T> T test(List<T> list){
	return list.get(random.nextInt(list.size()));
}

泛型类中的泛型方法的泛型标识符优先级高于泛型类 如果泛型类的泛型标识为T,泛型类中的泛型方法的标识也为T,当我们new出泛型类,指定泛型为Integer之后,再调用泛型方法,并指定泛型为String,依旧是可以的。

泛型类中使用的泛型类的成员方法,不能作为静态方法,但是泛型方法可以。


可变参数

public <E> void print(E... es){
	for(E e:es){
		sout(e);
	}
}

4. 类型通配符

类型通配符一般是?,代替具体的类型实参==>类型通配符是实参,不是形参。

类型通配符可以实现重载和多态。

类型通配上限 指定通配上限为Number,此时通配时可以使用Number及其子类

public static void test(Box<? extends Number> boxs){
	Integer box = boxs.getFirst();
}

类型通配下限 指定通配必须是该类型及其父类。

public static void test(Box<? super Number> boxs){
  	//Integer box = boxs.getFirst();
  	Object  box = boxs.getFirst();
}

5. 泛型擦除

泛型只作用于编译阶段,编译后泛型会被擦除,因此泛型能够与jdk1.5之前的版本兼容。

无限制类型擦除

如果仅仅是<T>,则统统擦除为Object

有限制类型擦除

如果存在上限,则擦除为上限

桥接方法

父类会按无限制擦除规则擦除,子类会生成一个桥接方法。

6. 泛型和数组

可以声明带泛型的数组引用,但不能直接创建带泛型的数组对象

可以通过java.lang.reflect.Array的newInstance(Class<T>, int)创建T[]数组

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA 泛型

    命名类型参数 推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++ 模板的比较),并反映了...

    用户1688446
  • Java 泛型

    1、泛型的由来   我们先看下面这段代码: List list = new ArrayList(); list.add(24...

    IT可乐
  • Java泛型

    1.java泛型及就是在jdk1.5之后出现的一个新的安全机制 我们发现在集合框架中我们可以放入任何的元素,然而这样做并没有任何意义,绝大多时候我们是默认我...

    lwen
  • Java 泛型

    泛型实质上就是使用程序员定义安全的数据类型。在没有出现泛型之前,Java也提供了对Object的引用“任意化”操作,这种“任意化”操作就是对Object引用进行...

    赵哥窟
  • Java 泛型

    如果我们只写一个排序方法,就能够对整型数组、字符串数组甚至支持排序的任何类型的数组进行排序,这该多好啊。

    Java深度编程
  • Java 泛型

    上述的程序中,利用Point类存储整型数据,利用Object对象进行存储,向下转型为int型

    Mirror王宇阳
  • java泛型

    集合有一个特点——当你把对象丢进集合中,集合就会“忘记”这个对象的类型,而把它当做Object类型来处理。这样当程序员不小心将不同类型的数据丢进同一个集合中时...

    说故事的五公子
  • Java泛型

    先科普一下知识,什么是泛型?聊啥概念,直接上代码,直奔主题,先从 JDK 1.8 摘点源码出来,一起与泛型打个照面,混个脸熟。

    JAVA葵花宝典
  • Java泛型

    Java泛型是JavaSE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型在定...

    闲花手札
  • Java 泛型

    【1】解决元素存储的安全性问题。 【2】解决获取数据元素时,需要类型强转的问题。

    Java架构师必看
  • Java 泛型

    在J2SE 5.0中引入的这个对类型系统期待已久的增强允许类型或方法在提供编译时类型安全性的同时操作各种类型的对象。它将编译时类型安全性添加到集合框架中,并消除...

    Erossssssss
  • Java——Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,...

    说故事的五公子
  • Java 泛型(上)

    开发一个能够存储各种类型对象(比如:String 对象、Integer 对象等)的容器(容器就是存储数据的,可以是对象,可以是数组等等)。

    帅飞
  • Java 泛型(Generic)

    Java在1.5之后加入了泛型的概念。泛型,即“参数化类型”。泛型的本质是为了参数化类型(将类型参数化传递)(在不创建新的类型的情况下,通过泛型指定的不同类型来...

    HLee
  • Java 泛型详解

    三哥
  • Java 泛型详解

    泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类...

    Java团长
  • Java泛型详解

    定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型...

    Java团长
  • Java泛型详解

    Java泛型是jdk1.5中引入的一个新特性,泛型提供了编译时的类型检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型是Java中一个非常重要的知识点,...

    Java团长
  • Java泛型学习

    1、泛型的概念     泛型即“参数化类型”,就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变。而泛型的出现,就是为了解决...

    JMCui

扫码关注云+社区

领取腾讯云代金券