我希望从编译时以及运行时的角度来看,.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/

10-10 21:30
查看更多