Java有类型擦除,人们说在运行时无法确定泛型对象的类型,除非使用一些技巧。考虑下面的代码:
public class TestClass<T> {
private T genericField;
public TestClass(T genericField) {
this.genericField = genericField;
}
public void printTypeInfo() {
System.out.println("Hi I'm a " + genericField.getClass());
System.out.println("Am I a string? " + (genericField instanceof String));
System.out.println("Am I a long? " + (genericField instanceof Long));
}
public static void main(String [] args) {
TestClass<String> genericString = new TestClass<>("Hello");
TestClass<Long> genericLong = new TestClass<>(111111L);
genericString.printTypeInfo();
System.out.println("------------------");
genericLong.printTypeInfo();
}
}
它给我以下结果:
Hi I'm a class java.lang.String
Am I a string? true
Am I a long? false
------------------
Hi I'm a class java.lang.Long
Am I a string? false
Am I a long? true
似乎运行时可以轻易获取类型信息。我错过了什么吗?
printTypeInfo()
中打印this.getClass()
将为两个测试用例产生相同的结果,这有助于突出显示确定genericField
值类型的能力与确定TestClass
实例类型参数的能力之间的差异。 - Jason C