这里的方法" returnObj"能够返回" TestGen"类型的对象即使" Type Erasure"已将T减少为对象。
class TestGen
{
}
class MyGeneric<T>
{
T obj;
MyGeneric(T giveObj)
{
obj = giveObj;
}
T returnObj()
{
return obj;
}
}
public class TestGeneric {
public static void main(String[] args) {
MyGeneric<TestGen> mg = new MyGeneric<TestGen>(new TestGen());
TestGen tg = mg.returnObj();
}
}
答案 0 :(得分:2)
这是所有编译器的诡计:因为编译器知道MyGeneric
的类型参数是TestGen
,所以它会在场景后面静静地插入一个类型。如果您从字节码反编译回调,它看起来像这样:
TestGen tg = (TestGen)mg.returnObj();
编译器已验证调用将在运行时成功。