覆盖等于检查类类型或原始 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的一些概念需要使用包装类而不是原始数据类型[重复]