[英]How to cast generic Class type into an another generic Class type in Java
這就是我要的:
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
}
}
但是顯然我不能以這種方式轉換類類型。
有辦法嗎? 我很好奇...
謝謝!
首先,類型Class<A>
的值只能是確切類A
的類對象,而不能是任何其他類。 其他一些類B
的類對象將是Class<B>
,而Class<B>
絕不是Class<A>
的子類型。 您可能想要一個Class<? extends A>
Class<? extends A>
參數。
其次,您對.isAssignableFrom()
似乎是向后的(除了它在語法上無效,因為B
不是有效的表達式)。 clazz.isAssignableFrom(B.class)
表示clazz
表示的類是B
的超類 ,在這種情況下,將clazz
為Class<? extends B>
Class<? extends B>
。 您可能需要B.class.isAssignableFrom(clazz)
。
一旦在上面進行了第一個更改(將clazz
類型的Class<? extends A>
),則強制轉換將進行編譯,盡管它將是未經檢查的強制轉換。 如果您不希望進行強制檢查,可以使用clazz.asSubclass(B.class)
代替(Class<? extends B>)clazz
clazz.asSubclass(B.class)
(Class<? extends B>)clazz
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.