Java泛型:为什么someObject.getClass()不返回Class <?延伸T>?

jav*_*top 12 java generics types class type-safety

我希望从编译时间以及运行时方面来看.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>
  }

}
Run Code Online (Sandbox Code Playgroud)

编辑:它不工作Class<T>,并Class<? super T>任.

Tom*_*ine 6

java.lang.Class不代表类型(java.lang.reflect.Type用于此).如果T,ArrayList<String>那么说那就没有意义了Class<ArrayList<String>>.

值得注意的是,在这种特殊情况下,该方法不需要是通用的.

public static <T extends MyClass> void myMethod(T instance) {
Run Code Online (Sandbox Code Playgroud)

相当于:

public static void myMethod(MyClass instance) {
Run Code Online (Sandbox Code Playgroud)


San*_*rma 4

根据getClass方法的 Javadoc :

实际的结果类型是Class<? extends |X|>|X| 是删除所调用的表达式的静态类型getClass。例如,此代码片段中不需要强制转换

|X|在这里,代码片段中的值为MyClass,因此instance.getClass()只能分配给Class<? extends MyClass>Class<?>

这种特定措辞的原因是因为当您说对于具有 T where 类型的变量时<T extends MyClass>,可以有多个扩展的类MyClass,因此能够满足T extends MyClass标准。如果没有运行时信息,就无法知道MyClass方法中传递了哪个具体实现子类。因此,为了提供通用解决方案,它会返回,因为无论传入什么类实例,<? extends MyClass>这对于任何子类都适用。MyClass

  • 我不明白为什么 X 是 MyClass,而不是 T。 (3认同)
  • 哦,终于我明白了。语言规范 4.6 明确指出“类型变量(第 4.4 节)的擦除是其最左边界的擦除”。在我们的例子中是 MyClass。但我不明白他们为什么这样做。 (3认同)