Java 重写等于检查类类型或基元int

Java 重写等于检查类类型或基元int,java,overriding,equals,Java,Overriding,Equals,我试图找出一种方法,使我的类的equals方法对类类型或基元int有效,但我的方法有点不对劲: class MyClass { int myID; .... [other class variables/methods] .... @Override public boolean equals(Object obj) { if (!(obj instanceof MyClass)) { // False i

我试图找出一种方法,使我的类的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的实例,而不必手动迭代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 myClassList=新建ArrayList();
int-someID=5;
MyClass MyClass=新的MyClass([用myID=5初始化]);
MyClass otherClass=新的MyClass(MyClass);
添加(myClass);
myClassList.contains(其他类);//返回true
myClassList.contains(someID);//返回true

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

你打破了
equals
方法的契约,给自己埋下了麻烦,即使你能找到一种方法让它工作

Java8流怎么样

static boolean listContainsId(List<MyClass> list, int id) {
    return list.stream().anyMatch(mc -> mc.myID == id);
}
静态布尔listContainsId(列表,int-id){
返回list.stream().anyMatch(mc->mc.myID==id);
}

你违反了
equals
方法的约定,这给你自己埋下了麻烦,即使你能想出一个办法让它发挥作用

Java8流怎么样

static boolean listContainsId(List<MyClass> list, int id) {
    return list.stream().anyMatch(mc -> mc.myID == id);
}
静态布尔listContainsId(列表,int-id){
返回list.stream().anyMatch(mc->mc.myID==id);
}

创建自己的ArrayList类型怎么样

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

    public boolean contains(int id) {
        return super.contains(new MyClass(id));
    }
}
公共类MyArrayList扩展了ArrayList{
公共布尔包含(int-id){
返回super.contains(新的MyClass(id));
}
}

创建自己的ArrayList类型怎么样

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

    public boolean contains(int id) {
        return super.contains(new MyClass(id));
    }
}
公共类MyArrayList扩展了ArrayList{
公共布尔包含(int-id){
返回super.contains(新的MyClass(id));
}
}

a
ArrayList
不能包含基元
int
。这是个坏主意。使用适当的技术,迭代。或者使用映射。创建一个可以等于
int
的pojo听起来是个坏主意,会/可能会导致混淆代码和行为。使用
myClassList.contains(someID)可能很“酷”,但另一种方法,如手动迭代,将导致更干净、更不标准的代码。我现在无法检查,但我相当确定,当您执行
ArrayList.contains(b)
时,实际上调用的是
b.equals(…)
,而不是
.equals(b)
。由于无法重写
Integer
类的
equals
,因此无法使其工作。@谢谢。这更有意义,因为您只需检查
null
一次。这并不重要,这将是一个可怕的想法,即使它工作!
ArrayList
不能包含基元
int
。这是个坏主意。使用适当的技术,迭代。或者使用映射。创建一个可以等于
int
的pojo听起来是个坏主意,会/可能会导致混淆代码和行为。使用
myClassList.contains(someID)可能很“酷”,但另一种方法,如手动迭代,将导致更干净、更不标准的代码。我现在无法检查,但我相当确定,当您执行
ArrayList.contains(b)
时,实际上调用的是
b.equals(…)
,而不是
.equals(b)
。由于无法重写
Integer
类的
equals
,因此无法使其工作。@谢谢。这更有意义,因为您只需检查
null
一次。这并不重要,这将是一个可怕的想法,即使它工作!