【发布时间】: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