覆盖等于检查类类型或原始 int [重复]

Posted

技术标签:

【中文标题】覆盖等于检查类类型或原始 int [重复]【英文标题】:Override equals to check against class type or primitive int [duplicate] 【发布时间】: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。没关系 - 即使它有效,这也是一个糟糕的主意! 【参考方案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));
    

【讨论】:

以上是关于覆盖等于检查类类型或原始 int [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将第一列数据类型从 float 转换为 int,并写回原始 csv 文件 [重复]

如何检查url查询字符串是不是等于javascript(或jquery)[重复]

为啥java的一些概念需要使用包装类而不是原始数据类型[重复]

C ++中的原始类型与C中的原始类型[重复]

如何检查字符串是不是能够转换为 float 或 int [重复]

覆盖的 equals() 方法需要空检查吗? (java) [重复]