【问题标题】:Override equals to check against class type or primitive int [duplicate]覆盖等于检查类类型或原始 int [重复]
【发布时间】:2016-08-03 14:35:33
【问题描述】:

我正在想办法让我的类的 equals 方法适用于类类型或原始 int,但我的方法感觉不对:

class MyClass {
    int myID;
    ....
    [other class variables/methods]
    ....

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof MyClass)) {
            // False if neither an int nor a myClass
            if (!(obj.getClass().equals(int.class))) {
                return false
            }
            // If int, check against myID
            return ((int) obj).myID == myID);
        }
        // If myClass check against that object's myID
        return ((MyClass) obj).myID == myID);
    }
}

我想这样做的原因是,如果我有一个 ArrayList myClassList,我希望能够为 MyClass 或 int 的实例执行 .contains,而不必手动迭代 ArrayList 以获得 int。像这样:

ArrayList<MyClass> myClassList = new ArrayList<MyClass>();

int someID = 5;
MyClass myClass = new MyClass([initialize with myID = 5]);
MyClass otherClass = new MyClass(myClass);

myClassList.add(myClass);

myClassList.contains(otherClass); // returns true
myClassList.contains(someID); // returns true

我以前从未遇到过这种情况,所以我不知道最干净的方法是什么。

【问题讨论】:

  • 一个ArrayList 不能包含原始int(s)。
  • 这是个坏主意。使用适当的技术,迭代。或者使用地图。
  • 创建一个等于int 的pojo 听起来是个坏主意,并且会/可能导致混淆代码和行为。使用myClassList.contains(someID); 可能很“酷”,但另一种方法,比如手动迭代,会产生更清晰、更不可靠的代码。
  • 我现在无法检查,但我相当确定当您执行ArrayList.contains(b) 时,实际上调用的是b.equals(...),而不是.equals(b)。由于您无法覆盖 Integer 类的 equals,因此无法使其正常工作。
  • @Pillar 谢谢。这更有意义,因为您只需检查一次null。没关系 - 即使它有效,这也是一个糟糕的主意!

标签: java overriding equals


【解决方案1】:

你破坏了equals方法的约定,你是在给自己埋下麻烦,即使你能想办法让它工作。

Java 8 流怎么样?

static boolean listContainsId(List<MyClass> list, int id) {
    return list.stream().anyMatch(mc -> mc.myID == id);
}

【讨论】:

    【解决方案2】:

    如何创建自己的 ArrayList 类型。

    public class MyArrayList<E> extends ArrayList<E> {
    
        public boolean contains(int id) {
            return super.contains(new MyClass(id));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2013-02-02
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多