Java 检查泛型类是否为抽象类的实例

Java 检查泛型类是否为抽象类的实例,java,class,abstract,instanceof,Java,Class,Abstract,Instanceof,输出: public static void main(String[] args) { Class b = B.class; System.out.println(b.isAssignableFrom(A.class)); } static abstract class A{ } static class B extends A{ } 输出为false,我尝试使用instanceof,但它有编译错误,请帮助 编辑已解决您需要比较基类是否可从扩展中赋值非常愚蠢,您无法使用抽

输出:

public static void main(String[] args)
{
    Class b = B.class;
    System.out.println(b.isAssignableFrom(A.class));
}
static abstract class A{

}
static class B extends A{

}
输出为false,我尝试使用instanceof,但它有编译错误,请帮助


编辑已解决您需要比较基类是否可从扩展中赋值非常愚蠢,您无法使用抽象的is类实例

您的类
B
A
扩展,而不是相反。想象一个更具体的例子,比如

false
B.class.isAssignableFrom(A.class)
的结果正确
false
,因为您正在询问

我可以将
动物
A
)分配给
B
)吗

这在一般情况下是不可能的,因为可能有不同的动物,比如猫

public abstract class Animal { ... }
public class Dog extends Animal { ... }
public class Cat extends Animal { ... }
有关更多详细信息,请参见该方法的:

确定此类对象表示的类或接口是否与指定的类参数表示的类或接口的相同,或是超类超接口。如果是,则返回
true
;否则它将返回
false
。如果此类对象表示基元类型,则如果指定的类参数正是此类对象,则此方法返回
true
;否则它将返回
false

具体而言,此方法测试指定类参数表示的类型是否可以通过标识转换或通过加宽引用转换转换为该类对象表示的类型。有关详细信息,请参阅Java语言规范,第节和


这里没有泛型。并且结果是正确的,您不能从
a
分配到
B
。请阅读文档,即的javadoc,其中说明:确定此类对象表示的类或接口是否与指定的类参数表示的类或接口相同,或者是该类或接口的超类或超接口“。由于
B
不是
a
的super,因此方法返回
false
——如果您想要A的
b实例
,那么请反向调用:
A.class.isAssignableFrom(b)
可能与“我可以将动物(A)分配给狗(b)”重复。既然b扩展了A,那么它应该返回true,我认为java在这里是错误的。因为狗是一种动物,它可以被铸造回一种动物。例如,如果它们都是对象,我可以说是dog instanceof animal,它将返回true,然后我说是dog assignable to animal says false。Java在这方面肯定是错误的。现在,若你们说猫是可分配给狗的,那个么它应该返回false,但若它扩展了它,就不会返回false。是的,我刚刚注意到它是从。它们应该具有class.isInstanceof()或修复编译器,以允许(类对象实例of AbtractClass){//do code}逻辑与您的想法相反。这个方法反过来问这个问题。它询问是否可以将动物分配给狗。或者,如果一只狗可以从一只动物身上赋值,那么,是的。它返回的值与
运算符的
实例相同。因此,您可以执行
Animal.class.isInstance(dog)
,也可以尝试
dog.class.isInstance(Animal)
,如果动物属于
dog
类型,则返回
true
,就像您可以执行
if(dog instanceof Animal)
if(Animal instanceof dog)
一样。
Animal animal = new Cat();
Dog dog = (Dog) animal; // Will not work since animal is a cat