覆盖等于检查类类型或原始int

时间:2016-04-12 19:32:31

标签: java override equals

我正在试图找出一种让我的类'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

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

2 个答案:

答案 0 :(得分:3)

您正在通过违反equals方法的合同为自己存储麻烦,即使您可以找到使其有效的方法。

Java 8流怎么样?

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

答案 1 :(得分:1)

如何创建自己的ArrayList类型。

public class MyArrayList<E> extends ArrayList<E> {

    public boolean contains(int id) {
        return super.contains(new MyClass(id));
    }
}