我可以使用 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!        
}
}

因此,我的结论是,可分配的答案并不总是正确的。这是一个正确的结论吗?有没有更好的方法来检查运行时的子类型?

谢谢。

您被类型擦除绊倒了。isAssignableFrom方法对擦除(原始)类型I进行操作。另一方面,编译器看到您尝试将I<Integer>分配给I<String>,并不允许分配。

您可以通过getGenericInterfaces et. al确定实际实现的类型。然后你可以检查返回的类型是否是ParamterizedType的实例,并绑定实际的类型。

不过,通常很少需要这样做。

相关内容

  • 没有找到相关文章

最新更新