如何使用泛型类型执行instanceof和typecast

Urq*_*art 2 java generics

在下面的代码中,我有两个方法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;
}
Run Code Online (Sandbox Code Playgroud)

ern*_*t_k 6

正如您自己说的那样,它已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;
}
Run Code Online (Sandbox Code Playgroud)

这样,当您需要给定的子类类型时,可以使用以下命令进行调用:

C c = as_T(a, C.class);
B b = as_T(a, B.class);
Run Code Online (Sandbox Code Playgroud)