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 } } 

编辑:它不适用于ClassClass Class要么。

根据getClass方法的Javadoc :

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

这里, |X|的值 在你的代码片段中是MyClass ,因此instance.getClass()只能分配给Class ClassClass

这个特定措辞的原因是因为当你说这个变量有类型T,其中 ,可以有多个类扩展MyClass ,因此能够满足T extends MyClass标准。 没有运行时信息,就无法知道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 type = instance.getClass(); 

你需要使用

 Class type = instance.getClass(); 

你不能在这里直接使用T

原因是Object.getClass()的方法签名(您正在调用它)。 它的:

 public final Class getClass() 

所以你试图从Class ClassClass Class ,这是不允许的(因为你是向下的)。 允许使用显式强制转换:

 Class type = (Class) instance.getClass(); 

将起作用(虽然它会产生类型安全警告)。

Java不支持generics类型的,例如

对象可以实现

 class Object { Class getClass() } 

但getClass()无法表达它将返回一个类型,该类型是对象的类。 编译器没有本机了解此方法的function。

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