反射我可以使用isAssignableFrom检查C1是Java中C2的子类型吗?
以下是一个例子:
class test {
static interface I<A> { }
static class Y implements I<Integer> { }
public static void main(String[] args) {
// this is not allowed by the compiler:
//I<String> s = new Y() ;
// yet:
System.out.println(">" + I.class.isAssignableFrom(Y.class)) ; // true!
}
}
因此,我得出结论,isAssignable的答案并不总是正确的。这是正确的结论吗?有没有更好的方法在运行时检查子类型
谢谢--希望如此
# 1 楼答案
你被类型擦除绊倒了。
isAssignableFrom
方法对已擦除(原始)类型I
进行操作。另一方面,编译器看到您试图将I<Integer>
分配给I<String>
,并且不允许分配您可以通过getGenericInterfaces等确定实际实现的类型。然后您可以检查返回的类型是否是
ParamterizedType
的实例,并获得实际的类型绑定但通常情况下,这很少是必要的