Javagenerics:为什么someObject.getClass()不返回Class ?
我希望从编译时间以及运行时方面来看, .getClass()
提供正确类型的返回值不会有问题。
但我一定是错的。
public class _GetClassGenerics2 { static class MyClass { } public static void main(String[] args) { MyClass myInstance = new MyClass(); // here it works Class type = myInstance.getClass(); myMethod(myInstance); } public static void myMethod(T instance) { Class type = instance.getClass(); // java.lang.RuntimeException: Uncompilable source code - incompatible types // required: java.lang.Class // found: java.lang.Class } }
编辑:它不适用于Class
和Class
Class
要么。
根据getClass
方法的Javadoc :
实际的结果类型是
Class extends |X|>
Class extends |X|>
where | X | 是擦除调用getClass
的表达式的静态类型。 例如,此代码片段中不需要强制转换
这里, |X|
的值 在你的代码片段中是MyClass
,因此instance.getClass()
只能分配给Class extends MyClass>
Class extends MyClass>
或Class>
。
这个特定措辞的原因是因为当你说这个变量有类型T,其中
,可以有多个类扩展MyClass
,因此能够满足T extends MyClass
标准。 没有运行时信息,就无法知道MyClass
哪个具体实现子类在方法中传递。 因此,为了提供通用解决方案,它返回 extends MyClass>
extends MyClass>
因为无论传递什么类实例,它都适用于MyClass
任何子类。
java.lang.Class
不表示类型(使用java.lang.reflect.Type
)。 如果是T
,那么说ArrayList
则没有意义的是有一个Class
。
值得注意的是,在这种特殊情况下,该方法不需要是通用的。
public static void myMethod(T instance) {
相当于:
public static void myMethod(MyClass instance) {
代替
Class extends T> type = instance.getClass();
你需要使用
Class extends MyClass> type = instance.getClass();
你不能在这里直接使用T
原因是Object.getClass()
的方法签名(您正在调用它)。 它的:
public final Class extends Object> getClass()
所以你试图从Class extends Object>
Class extends Object>
为Class extends T>
Class extends T>
,这是不允许的(因为你是向下的)。 允许使用显式强制转换:
Class extends T> type = (Class extends T>) instance.getClass();
将起作用(虽然它会产生类型安全警告)。
Java不支持generics类型的
对象可以实现
class Object { Class getClass() }
但getClass()无法表达它将返回一个类型,该类型是对象的类。 编译器没有本机了解此方法的function。
恕我直言,应该支持此行为。