![](/img/trans.png)
[英]How to cast someobject.getClass() to Class<Object> without SuppressWarnings(“unchecked”)?
[英]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
)。 如果T
为ArrayList<String>
则没有Class<ArrayList<String>>
。
值得注意的是,在这种特殊情况下,不需要通用方法。
public static <T extends MyClass> void myMethod(T instance) {
等效于:
public static void myMethod(MyClass instance) {
实际的结果类型是
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.