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

我可以使用isAssignableFrom检查C1是Java中C2的子类型吗?,java,reflection,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.pri

以下是一个例子:

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!        
}
}
类测试{
静态接口I{}
静态类Y实现I{}
公共静态void main(字符串[]args){
//编译器不允许这样做:
//I s=新的Y();
//然而:
System.out.println(“>”+I.class.isAssignableFrom(Y.class));//真!
}
}
因此,我得出结论,isAssignable的答案并不总是正确的。这是正确的结论吗?有没有更好的方法在运行时检查子类型

谢谢--但愿如此。

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

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


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

我明白了。好。。Java中也有这种“类型”的东西,它确实给了我完整的信息。见:file:///C:/apps/Java/jdk1.8.0/docs/api/java/lang/reflect/Type.html 是不是类似于isAssignableFrom,它对类型进行操作?@user3501141否,但是
Type
通常可以被转换为可以获取原始类并对其进行可赋值检查的对象。您确切的问题是什么
Y
I
的一个子类型,因此
I
可从
Y
中识别。出于我的目的,我的意思是:Y是I的一个子类型,如果Y的任何实例也是I的实例。给定任何类型的Y和I,我需要能够在运行时检查这一点。这就是您当前正在做的。嗯。。。这也不是我想知道的。“I”有类型参数,这使它容易混淆。我想要的是有一段代码来检查Y是否是I的子类型。