在下面的代码中,我有两个方法as_A
和as_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;
}
答案 0 :(得分: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;
}
因此,当您需要给定的子类类型时,可以使用:
C c = as_T(a, C.class);
B b = as_T(a, B.class);