泛型

jdk1.5支持泛型很大程度上是为了让集合能够记住其元素的类型

在没有泛型之前,一旦把一个对象放入集合中,集合便会忘记对象的类型,把所有的对象当成Object类型处理(为了能保存所有类型,保证通用性),当从集合中取出时,就需要进行强制类型转换,这样不仅代码臃肿,而且容易引起ClassCastException

增加了泛型支持的集合,代码更加简洁健壮,可以保证如果编译时没有发出警告,运行时就不会产生ClassCastException,此外,泛型还增强了枚举类,反射等方面的功能

java7前:List<String> l = new List<String>();

java7后:菱形语法:List<String> l = new List<>();

所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法时动态的指定(即传入实际参数)。

定义泛型接口:

  public interface A<E, B>{void add(E x);void get(B a);}    Set<K>是特殊的数据类型,可以认为是Set的子类

定义泛型类:

  public class B<T>{public T a;public static void main(String[] args){B<String> q = new B<>(); B<Double> w = new B<>();}}

派生时:

  实现泛型接口或者继承泛型父类时,接口和父类不能包含类型形参:public class S extends B<t>{}   这是错误的

  传入实际类型是正确的:public class S extends B<Steing>{}

实际不存在泛型类,不管泛型的实际类型参数是什么,运行时还是同一个类,内存中只占一块内存空间,所以静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用类型形参

  public class A<T>{static T a;}  这是错误的

系统不会真正生成泛型类,所以instanceof运算符后不能使用泛型

  a instanceof Object<String>  这是错误的

类型通配符:

  ?  List<?> l = new ArrayList<String>();  List<?>仅表示是各种List泛型的父类,但不能把元素加入到其中,c.add(new Object())会报错,因为不知道具体是什么类型

  ? extends XX  受限制的通配符,只要是XX的子类就可以,但也不能把XX或者XX的子类对象放入,因为也不知道具体类型

类型形参的上限:<T extends String & 接口...>

下限:<? super T>

原文地址:https://www.cnblogs.com/zawjdbb/p/7061721.html