Java泛型

一、泛型概述

为什么要使用泛型

  • 在java中增加泛型之前,泛型程序设计使用继承来实现的
  • 坏处:
    1)需要进行强制转换
    2)可向集合中添加任意类型的对象,存在风险

泛型的使用:

List<String>.list=new ArrayList<String>();
//java SE7及以后的版本中,构造方法中可以省略泛型类型
List<String> list=new ArrayList<>();

泛型与多态:
注:变量声明的类型必须匹配传递给实际对象的类型

二、泛型作为方法参数

泛型作为方法参数:

public void sellGoods(List<? extends Goods> goods) {}
public void sellApple(List<? super Apple> apples) {}
//其中<? extends Goods>表示Goods类及其子类;<? super Apple>表示Apple类及其父类。

三、自定义泛型类

自定义泛型相当于把类进行了参数化,具体类型由传入的参数来决定。泛型用的符号是任意的,一般采用T或E。

具体地,对于类 public class NumGeneric<T>{},泛型T表示NumGeneric类会使用T作为类中某些成员变量的类型、方法参数的类型或方法返回值的类型等。至于T具体会是什么类,则由实例化NumGeneric对象时传入的泛型参数来决定,如截图中第13行代码则是以Integer类作为具体的泛型类型。
具体地,对于类 public class NumGeneric<T,X>{},泛型T,X表示NumGeneric类会使用T和X作为类中某些成员变量的类型、方法参数的类型或方法返回值的类型等。一般地,可以推广为有更多个泛型类型的情况。

四、自定义泛型方法

1、泛型可以声明在类的声明中,这些类可称为泛型类。
如对于类 public class NumGeneric<T,X>{},泛型T,X表示NumGeneric类会使用T和X作为类中某些成员变量的类型、方法参数的类型或方法返回值的类型等。

2、泛型也可以直接声明在非泛型类中的方法声明中,这些方法可称为泛型方法。
如对于

public class GenericMethod{
	public <T extends Number> void println(T t){...}
}

而言,即是将泛型声明在非泛型类中的方法声明中,其中表示传入的泛型T必须是Number类及其子类对象,写在这里是对传入的泛型T的一种限定。


版权声明:本文为BWface原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。