我希望从编译时以及运行时的角度来看,.getClass()
提供正确类型的返回值都不会成为问题。
但是我一定是错的。
public class _GetClassGenerics2 {
static class MyClass {
}
public static void main(String[] args) {
MyClass myInstance = new MyClass();
// here it works
Class<? extends MyClass> type = myInstance.getClass();
myMethod(myInstance);
}
public static <T extends MyClass> void myMethod(T instance) {
Class<? extends T> type = instance.getClass();
// java.lang.RuntimeException: Uncompilable source code - incompatible types
// required: java.lang.Class<? extends T>
// found: java.lang.Class<capture#1 of ? extends _GetClassGenerics2.MyClass>
}
}
编辑:也不与
Class<T>
和Class<? super T>
一起使用。 最佳答案
根据the Javadoc of the getClass
method:
此处,您的代码段中|X|
的值为MyClass
,因此instance.getClass()
仅可分配给Class<? extends MyClass>
或Class<?>
。
使用这种特定措辞的原因是因为当您说该类型为T的变量(其中<T extends MyClass>
)时,可以存在多个扩展MyClass
并因此能够满足T extends MyClass
标准的类。没有运行时信息,就无法知道方法中传递了MyClass
的哪个具体实现子类。因此,为了提供一个通用的解决方案,它返回<? extends MyClass>
,因为无论传入哪种类实例,MyClass
的任何子类都适用。
关于Java泛型: why someObject. getClass()不返回Class <?延伸T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4460580/