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>任.
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)
根据该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