我认知中,java
虚拟机是不认识泛型类或泛型方法的,所以在编译成字节码的时候,所有的泛型类或泛型方法,都会被转换成普通的类或方法。
例如:
// 泛型类
class Test<T> {
public T res = null;
public Test(T res){
this.res = res;
}
public T get(){
return this.res;
}
}
Test t = new Test<String>("泛型类-Test的泛型方法-get");
// 报错
String res = t.get();
编译时类型参数发生替换(类型擦除),也就是编译后的字节码中的代码应该长下面这样:
public class Test {
private String res = null;
public Test(String res){
this.res = res;
}
public String get(){
return this.res;
}
}
Test t = new Test("泛型类-Test的泛型方法-get");
// 报错!类型擦除后,为什么调用该方法返回的类型是:Object ?
String t = t.get();
问题就出现在:
Test t = new Test<String>();
// 报错!这边返回的是 Object
String res = t.get();
我很郁闷 .... ,不能理解为什么提供了类型参数后进行方法调用返回的不是提供的类型 String
而是 Object
类型?
然而,在如下场景中,结果却正确了
// 结果正确
Test<String> t = new Test<>();
String res = t.get();
这是为什么??
吃鸡游戏
当年话下
扬帆大鱼
相关分类