簡體   English   中英

如何使用泛型進行 instanceof 和類型轉換

[英]How to do instanceof and typecast with a generic type

在下面的代碼中,我有兩個方法as_Aas_B ,它們基本上做同樣的事情,但具有不同的類型 A 和 B。我如何將這兩個方法合並為一個參數化方法? as_T中顯示的方法不起作用,因為泛型類型在運行時被擦除。

class A {}
class B extends A {}
class C extends A {}

B as_B(A a) {
    if (a instanceof B)
        return (B) a;
    else
        return null;
}

C as_C(A a) {
    if (a instanceof C)
        return (C) a;
    else
        return null;
}

<T extends A> T as_T(A a) {
    if (a instanceof T) // compile error because of type erasure
        return (T) a;
    else
        return null;
}

正如您自己所說, T被擦除,編譯器會阻止涉及泛型類型或類型參數的instanceof檢查。

根據您使用as_T方法的方式,您可以使用對應於T的類實例調用它,而不會出現編譯時警告:

<T extends A> T as_T(A a, Class<T> type) {
    if (type.isInstance(a)) 
        return type.cast(a);
    else
        return null;
}

因此,當您需要給定的子類類型時,您可以使用以下方式調用它:

C c = as_T(a, C.class);
B b = as_T(a, B.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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