主要优点和动机:在编译期间检测错误。
泛型类中的方法和泛型方法应该加以区别。泛型类和接口:public class Test<T> { } public interface Test1<T> { }泛型类的构造方法不变,没有泛型符号。
泛型方法:public static <T> void test(E[] list) 为了定义一个泛型方法,泛型类型放在方法返回类型之前。
受限泛型 <E extends 类名/接口名> 泛型指定为另外一种类型的子类型。
自动装箱与拆箱:声明的类型为最终的类型。
通配符:?、?extends T、?super T。 用途:对一个泛型类型指定范围。
泛型的使用:泛型类的实例化,
泛型方法的调用,只要参数出现泛型不管是类的泛型还是参数为泛型都需要定义为泛型方法。
泛型对象的传递需要用到通配符:Test<String> test=new Test<>();
Test<?> test1=test;
为什么会有通配符?extends T、? super T。因为编译的时候它只能用一个具体的类型去替换泛型,所以两个类有继承关系时,需要用到这些通配符。当然完全可以用到通配符?进行取代,但是如果方法中涉及到两类的向下转型或者其他表示两者有明确的里氏替换关系的调用时,可能会发生编译错误。如下:
v
泛型对象的传递需要用到通配符,但是通配符泛型对象加入值的时候需要注意。
Test<String> test = new Test<>();
Test<?> test1 = test;
加入Test类中有一个add方法:public void add(E t);
test1调用add方法,无法加入任何值,因为这里?表示任何类,有点像这个案例
String s = new String("hello");
Object o = s;
String s1 = o 会报错。
但是如果Test <? super String> test2 = test;
test.add("hello"); 是不会报错,因为?super String表示任何Stirng的父类,java可以向下转型。