您有任何问题或意见都可以在评论区回复哦,欢迎大家一起来讨论,共同学习进步

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){
    }
}

汤太咸
3 声望1 粉丝

程序员一枚,也爱读书,也爱理财,还喜欢把学到的读到的总结出来写点东西,写的不难,希望大家喜欢。