Согласно JavaDoc List.contains(o)
, определено, что он возвращает true
, если и только если этот список содержит хотя бы один элемент e
, такойчто (o==null ? e==null : o.equals(e))
.
Обратите внимание, что это определение вызывает equals
для o
, который является параметром , а не элементом, который находится вList
.
Поэтому будет вызываться String.equals()
, а не InnerClass.equals()
.
Также обратите внимание, что контракт на Object.equals()
гласит, что
* симметричный : для любых ненулевых опорных значений x
и y
, x.equals(y)
должен возвращать true
тогда и только тогда, когда y.equals(x)
возвращает true
.
Но вы нарушаете это ограничение, поскольку new TestClass("foo", 1).equals("foo")
возвращает true
, но "foo".equals(new TestClass("foo", 1))
всегда будет возвращать false
.
К сожалению, это означает, что ваш вариант использования (aпользовательский класс, который может быть равен другому стандартному классу) не может быть реализован полностью соответствующим образом.
Если вы все еще хотите сделать что-то вродедля этого вам придется внимательно прочитать спецификацию (а иногда и реализацию) всех ваших классов коллекций и проверить наличие таких ловушек, как этот.