简体   繁体   English

如何在Java中将通用类类型转换为另一个通用类类型

[英]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超类 ,在这种情况下,将clazzClass<? 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.

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