[英]How to cast generic Class type into an another generic Class type in Java
This is what I want: 这就是我要的:
interface A {}
abstract class B implements A {}
class C extends B { /*few fields*/ }
class D extends B { /*few different fields*/ }
public void doSomething(Class<A> clazz) {
if(clazz.isAssignableFrom(B)) {
doSomethingElse((Class<? extends B>)clazz); // casting is good, but cannot pass this way to doSomethingElse
}
}
public <T extends B> void doSomethingElse(Class<T> clazz) {
if(clazz.isAssignableFrom(C)) {
// do something with C fields
} else if(clazz.isAssignableFrom(D)) {
// do something with D fields
}
}
But obviously I cannot cast the class type this way. 但是显然我不能以这种方式转换类类型。
Is there a way to do it? 有办法吗? I am very curious... 我很好奇...
Thanks! 谢谢!
First of all, a value of type Class<A>
can only be the class object for the exact class A
, it cannot be any other class. 首先,类型Class<A>
的值只能是确切类A
的类对象,而不能是任何其他类。 The class object for some other class B
would be Class<B>
, and Class<B>
is never a subtype of Class<A>
. 其他一些类B
的类对象将是Class<B>
,而Class<B>
绝不是Class<A>
的子类型。 You probably want a Class<? extends A>
您可能想要一个Class<? extends A>
Class<? extends A>
parameter instead. Class<? extends A>
参数。
Second, your use of .isAssignableFrom()
seems backwards (besides the fact that it's syntactically invalid as B
is not a valid expression). 其次,您对.isAssignableFrom()
似乎是向后的(除了它在语法上无效,因为B
不是有效的表达式)。 clazz.isAssignableFrom(B.class)
means that the class represented by clazz
is a superclass of B
, in which case it makes no sense to cast clazz
to Class<? extends B>
clazz.isAssignableFrom(B.class)
表示clazz
表示的类是B
的超类 ,在这种情况下,将clazz
为Class<? extends B>
Class<? extends B>
. Class<? extends B>
。 You probably want B.class.isAssignableFrom(clazz)
instead. 您可能需要B.class.isAssignableFrom(clazz)
。
Once you make the first change above (make clazz
type Class<? extends A>
), the cast will compile, although it will be an unchecked cast. 一旦在上面进行了第一个更改(将clazz
类型的Class<? extends A>
),则强制转换将进行编译,尽管它将是未经检查的强制转换。 If you don't want an unchecked cast, instead of (Class<? extends B>)clazz
, you can do clazz.asSubclass(B.class)
. 如果您不希望进行强制检查,可以使用clazz.asSubclass(B.class)
代替(Class<? extends B>)clazz
clazz.asSubclass(B.class)
(Class<? extends B>)clazz
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.