【问题标题】:Java - instanceof for superclass [duplicate]Java - 超类的 instanceof [重复]
【发布时间】:2019-08-29 06:01:45
【问题描述】:

假设我有两个类:

public Class1 {
/* class body*/
}

public Class2 extends Class1 {
 public Class2 (int var1, int var2) {
 super(var11, var2); 
 }
}

现在我需要确定我拥有哪个类对象。在这种情况下,如何确定我是否拥有 Class1Class2 对象?

Object var1 = new Class1(1,2);
Object var2 = new Class2(1,2);

var2 instanceof Class2; /*true*/
var2 instanceof Class1 /*true*/

在这两种情况下,instanceof 都会返回 true。

【问题讨论】:

  • 使用 getClass();返回您需要的类型
  • someObject.getClass() 返回对象的类。但是请注意,您几乎不必这样做。使用多态性。
  • 另请注意,如果对象不是 Class2 的实例,则 someObject instanceof Class2 肯定不会返回 true。
  • @user1209216 “非直接实例”是什么意思?否决票很可能是由于自己很少努力找到解决方案。不过不确定,因为我没有投反对票
  • 这是XY Problem。告诉我们您真正需要什么,而不是您似乎不确定的模糊问题。

标签: java inheritance instanceof


【解决方案1】:

你可以使用equals:

if (this.getClass().equals(Class1.class) {
    // Do something...
}

【讨论】:

  • Class 类没有覆盖 equals,因此使用 == 进行比较可能会更好
  • @Stultuske 请问您为什么这么认为?当equals 未被覆盖时,这两个选项是等效的。
  • @Slaw 为一,如果 equals 未被覆盖,它将执行 == 比较。其次,使用 .equals(..) 并且不知道 equals 没有实现的人可能会认为有,并且可能会对实现做出假设
  • @Stultuske 我总是假设equals() 会给我正确的结果,如果它是由核心 API 实现的。反正Class类是finalObject.getClass()也是final native,除非你搞乱反射,否则它真的不会坏。
  • @Jai 谁在谈论什么破事?我说的是(没有经验的)开发人员必须维护代码的情况可能有错误的期望。例如,“equals 将比较整个路径,包括包,还是只比较名称”,......毕竟,当存在 equals 的实现时,这是可能的。通过实例调用静态方法也是可以的,也可以得到正确的结果,但还是不建议这样做
【解决方案2】:

测试它是否不是子类的实例:

   object instanceof Superclass
&& !(object instanceof Subclass)

或者,使用 if/else 链:

if (object instanceof Subclass) {
  // Do something.
} else if (object instanceof Superclass) {
  // Do something else.
}

选择取决于您实际尝试使用它的目的。

【讨论】:

  • 如果你的类有很多子类,那会变得很乱:)
  • 确实,这是我要避免的
  • @user1209216 您能否更具体地说明在想要避免的情况下“这个”是什么?如 JBNizet 所述,想要知道对象的类本身就是您应该尽量避免的事情。
  • 我有很多子类,所以这种做法会很乱。
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多