Strictly speaking such an implementation would be wrong.
The reason for this is that even if an object is not of type E
, it could still return true
on an equals()
call.
Assume for a second, that you've got a class like this:
public class FakeString {
private final String value;
public FakeString(String value) {
if (value == null) {
throw new IllegalArgumentException();
}
this.value = value;
}
public int hashCode() {
return value.hashCode();
}
public boolean equals(Object o) {
return value.equals(o);
}
}
Then this code would print true
:
List<String> strings = Arrays.asList("foo", "bar", "baz");
System.out.println(strings.contains(new FakeString("bar")));
And just to clarify: this behaviour is intended and is the reason why contains()
takes an Object
instead of E
. The same is true for remove()
, by the way.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…