今天看了一个关于泛型的视频,突然产生了几个疑问
- 定义了泛型的下界,那么下界在擦除过后是什么类型呢?
如果没有定义上界的话,那么默认的上界就是 Object,泛型擦除过后的类型为上界类型
public class PrintAnimal <T extends Animal>{
private T animal;
public PrintAnimal(T animal) {
this.animal = animal;
}
public void print(){
System.out.println(animal);
animal.say();
}
}
通过 jad 进行反编译,可以看到泛型擦除后泛型占位符变成了Animal
public class PrintAnimal
{
public PrintAnimal(Animal animal)
{
this.animal = animal;
}
public void print()
{
System.out.println(animal);
animal.say();
}
private Animal animal;
}
- Java是伪泛型,泛型是通过类型擦除实现的
public class MyListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("test");
String list1 = list.get(0);
System.out.println(list1);
System.out.println(list);
}
}
通过编译之后(使用 maven compile)
public class MyListTest {
public MyListTest() {
}
public static void main(String[] var0) {
ArrayList var1 = new ArrayList();
var1.add("test");
String var2 = (String)var1.get(0); // 这里插入强制类型转换
System.out.println(var2);
System.out.println(var1);
}
}
- 泛型函数、可变函数以及重载函数的选择
下面我分别用不同类型的函数进行了函数重载
public class Test2 {
public static void main(String[] args) {
int a=0,b=0;
print(a, b);
}
public static void print(int a, int b){
System.out.println("int a, int b"); // 1 (优先执行此方法)
}
public static void print(Integer a, Integer b){
System.out.println("Integer a, Integer b"); // 2 (当把 1 注释时,会执行此方法)
}
public static void print(int... args){
System.out.println("int... args"); // 4 (当把 1,2,3 注释时,会执行此方法)
}
public static <T> void print(T a, T b){
System.out.println("T a, T b"); // 3 (当把 1,2 注释时,会执行此方法)
}
}
通过结果可以看出进行函数调用的时候,会按照以下规则进行匹配:
- 匹配不需要进行装箱/拆箱的
- 匹配仅需要进行装箱/拆箱的
- 匹配泛型
- 匹配可变参数