有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

反射我可以使用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) 个答案

  1. # 1 楼答案

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

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

    但通常情况下,这很少是必要的