我可以使用isAssignableFrom检查C1是Java中C2的子类型吗?

时间:2014-04-05 12:53:27

标签: java reflection

以下是一个例子:

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在答案中并不总是正确的。这是正确的结论吗?有没有更好的方法来检查运行时的子类型?

感谢。 --Wish。

1 个答案:

答案 0 :(得分:1)

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

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

通常,这很少是必要的。