繁体   English   中英

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

[英]Java generics: why someObject.getClass() doesn't return Class<? extends T>?

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

java.lang.Class不代表类型(为此使用java.lang.reflect.Type )。 如果TArrayList<String>则没有Class<ArrayList<String>>

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

public static <T extends MyClass> void myMethod(T instance) {

等效于:

public static void myMethod(MyClass instance) {

按照getClass方法的Javadoc

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

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

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

Java不支持<this>的通用类型,例如

对象可以实现

class Object {
    Class<this> getClass()
}

但是getClass()无法表示将返回一个类型,即对象的类。 编译器也不了解此方法的功能。

恕我直言,此行为应得到支持。

代替

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 Object>Class<? extends T> Class<? extends T> ,这是不允许的(因为您正在向下广播)。 使用一个明确允许投:

Class<? extends T> type = (Class<? extends T>) instance.getClass();

将起作用(尽管它会生成类型安全警告)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM