我可以使用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的子类型。