下面是一个例子:
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!
}
}
因此,我的结论是,可分配的答案并不总是正确的。这是一个正确的结论吗?有没有更好的方法来检查运行时的子类型?
谢谢。
您被类型擦除绊倒了。isAssignableFrom
方法对擦除(原始)类型I
进行操作。另一方面,编译器看到您尝试将I<Integer>
分配给I<String>
,并不允许分配。
您可以通过getGenericInterfaces et. al确定实际实现的类型。然后你可以检查返回的类型是否是ParamterizedType
的实例,并绑定实际的类型。
不过,通常很少需要这样做。