关于java:JAVA基础知识之Generic泛型

5次阅读

共计 1265 个字符,预计需要花费 4 分钟才能阅读完成。

您有任何问题或意见都能够在评论区回复哦,欢送大家一起来探讨,独特学习提高

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){}}
正文完
 0