您有任何问题或意见都能够在评论区回复哦,欢送大家一起来探讨,独特学习提高
class级别定义时候须要应用"T",不能应用通配符"?",T示意确定的类型,?示意不确定的类型,具体如下:
//Person后边的<>只能放入T,并不能放入?public class Person<T> { T getPerson(){ return null; }}
然而在method中能够应用通配符"?"
extends示意泛型的上界(示意传入的参数必须是extends后边类型的子类),super示意泛型的下界(示意传入的参数必须是super后边的类型的父类)
public class Person<T extends Object> { T getPerson(){ return null; } public static void savePerson(List<? extends Object> persons){ }}
//通过super限定办法传入的只能是Man以及Man的父类以上public static void getList(List<? super Man> personList){ personList.forEach(s-> System.out.println(s));}List<Man> list = new ArrayList<>();list.add(new Man());getList(list);//通过extend限定办法传入的只能是Man以及Man的子类public static void getList(List<? extends Man> personList){ personList.forEach(s-> System.out.println(s));}
类型擦除后,如果不指定extends类型会报错,因为不晓得obj是哪种类型,所以必定也不晓得其办法有什么?
public class TestGeneric<T> { private T obj; public TestGeneric(T t){ obj= t; } public void test(){ obj.bits();//报错 }}
须要通过extends来指定是那个类型的子类,才能够调用T的办法
public class TestGeneric<T extends HashFunction> { private T obj; public TestGeneric(T t){ obj= t; } public void test(){ obj.bits(); }}
类型擦除时,如果两个办法的定义名称以及范型里面的所有都一样那么会编译报错,因为范型编译时候会类型擦除(理论就是去掉范型的局部),这时就会呈现两个同样的办法了,具体如下:
public class TestGeneric { public void print(Integer i){ } public void print(String i){ } public void print(List<String> i){ } //会报错,因为范型会导致类型擦除,编译器会认为上面办法和下面办法参数一样 public void print(List<Integer> i){ }}