【问题标题】:See if two object have the same type查看两个对象是否具有相同的类型
【发布时间】:2012-04-15 14:18:57
【问题描述】:

假设我有一个类 A,而 B、C、D 派生自 A。
如果我想知道引用的对象的类型是什么,我可以声明:

// pseudo-code
if(obj instanceof B)
    < is B>
else if(obj instanceof C)
    < is C>
else
    <is D>

这是因为我确信从 A 派生的类只有 B、C 和 D。
但是,如果我只想检查两个引用是否指向同一种对象呢?
所以像:

if(obj1 instanceof obj2)
   <do something>

但是语法当然是错误的。没有一千个if-else怎么检查这个?

【问题讨论】:

    标签: java instanceof


    【解决方案1】:

    你的意思是这样的

    obj1.getClass().equals(obj2.getClass())
    

    只要obj1obj2 属于同一特定类,这应该返回true。

    但如果您将AB extends A 进行比较,这将不起作用。如果您想要返回 true 的相等性,即使一个是另一个的子类型,您将不得不编写一个更强大的比较函数。我认为你可以通过循环使用getSuperClass() 来向上层级树。

    我认为一个简单的解决方案也可以做A.getClass().isAssignableFrom(B.getClass()),假设B extends A

    【讨论】:

    • 没有理由做.equals(),该类在池中只存在一次。
    • 必需不是风格问题。
    • 这正是我想要的。
    【解决方案2】:

    你可以的

    if (obj1.getClass() == obj2.getClass()) { ... }
    

    【讨论】:

      【解决方案3】:

      类似这样的:

      if(classA.getClass().getName().equals(classB.getClass().getName()))
           <do something>
      

      【讨论】:

        【解决方案4】:

        由于 B、C 和 D 是 A 的子类,并且您想对这些类做点什么,我不会使用 instanceOf 运算符。这个只有在别无他法的时候才有用。

        您可以更好地覆盖超级方法和/或变量,这样您就可以使用相同的所有对象,但它们会做不同的事情(例如打印它自己的类型)。

        【讨论】:

          【解决方案5】:

          instanceof 需要指向一个类,而不是另一个对象。要检查两个对象是否都来自同一类型的对象,请执行以下操作..

          if((obj1 instanceof ClassName) && (obj2 instanceof ClassName)) {
            do whatever
          }
          

          【讨论】:

          • 这实际上是不正确的。您正在检查两个对象是否是其他类型的后代。问题是找出两个对象是否相同,但任意类型。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 2019-12-17
          • 2012-04-29
          • 2016-09-15
          • 1970-01-01
          相关资源
          最近更新 更多