Java 重写等于检查类类型或基元int
我试图找出一种方法,使我的类的equals方法对类类型或基元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
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));
}
}
aArrayList
不能包含基元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
一次。这并不重要,这将是一个可怕的想法,即使它工作!