【问题标题】:Checking if Generic Class is instanceof Abstract Class检查泛型类是否是抽象类的实例
【发布时间】:2018-03-05 20:19:46
【问题描述】:
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,但出现编译错误,请帮忙

编辑已解决,您需要比较基类是否可以从扩展的非常愚蠢的分配,您不能使用是类 instanceof abstract 反正

【问题讨论】:

标签: java class abstract instanceof


【解决方案1】:

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

public abstract class Animal { ... }
public class Dog extends Animal { ... }
public class Cat extends Animal { ... }

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

我可以将Animal (A) 分配给Dog (B) 吗?

这通常是不可能的,因为可以有不同的动物,比如Cat

Animal animal = new Cat();
Dog dog = (Dog) animal; // Will not work since animal is a cat

更多详情参见方法的documentation

确定此 Class 对象表示的类或接口是否相同,或者是 superclasssuperinterface由指定的 Class 参数表示的类或接口。如果是,则返回true;否则返回false。如果这个Class对象代表一个原始类型,如果指定的Class参数正是这个Class对象,这个方法返回true;否则返回false

具体来说,这个方法测试指定Class参数所代表的类型是否可以通过身份转换转换为这个Class对象所代表的类型 或通过扩大参考转换。有关详细信息,请参阅 Java 语言规范,5.1.15.1.4 部分。

【讨论】:

  • “我可以将动物 (A) 分配给狗 (B) 吗?”好吧,因为 B extends A 它应该返回 true 我认为 java 在这里是错误的。因为狗是一种动物,它可以被扔回动物身上。例如,如果它们都是对象,我可以说是 dog instanceof animal 并且它会返回 true,那么我说 is dog assignable to animal 说 false。 Java 肯定是错误的。现在如果你说 cat 可以分配给 dog 那么它应该返回 false 但是,如果它扩展它,则不是
  • 是的,我刚刚注意到它说来自。他们应该有 class.isInstanceof() 或修复编译器以允许 if(classObject instanceof AbtractClass) { //do code }
  • 逻辑与你的想法相反。该方法以相反的方式提出问题。它询问是否可以将动物分配给狗。或者,等效地,如果一只狗可从动物分配给
  • 嗯,有Class#isInstance(Object)。它返回与instanceof 运算符相同的值。所以你可以做Animal.class.isInstance(dog),也可以试试Dog.class.isInstance(animal),如果动物是Dog类型,它会返回true,就像你可以做if (dog instanceof Animal)if (animal instanceof Dog)一样。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2014-12-06
  • 2016-12-31
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多