簡體   English   中英

如何在Java中將通用類類型轉換為另一個通用類類型

[英]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超類 ,在這種情況下,將clazzClass<? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM