Решение правильное, поскольку симметрия не нарушена. Вы ошибаетесь в отношении s.equals(cis)
. Он вернет false
в любом случае, поскольку String
внутренне проверяет, является ли другой объект также экземпляром String
и возвращает false
, если нет. (И CaseInsensitiveString
делает не простираться String
.)
Итак, как s.equals(cis)
является false
и cis.equals(s)
является false
, симметрия задается.
Sidenote о instanceof
Обратите внимание, что String#equals(Object o)
использует o instanceof String
проверить тип своего аргумента. Это верно, потому что String
- final
и не может быть подклассом! В противном случае мы могли бы написать подкласс String
и произойдет следующее:
String s = "Hello";
SubclassOfString sos = new SubclassOfString("Hello");
s.equals(sos) == true // as sos is instanceof String
sos.equals(s) == false // as s is NOT instanceof SubclassOfString
Так что, если ваши классы не final
, используйте this.getClass() == o.getClass()
вместо instanceof
для проверки типов в equals(Object)
!
Вы действительно пробовали 's.equals (cis)'? – chrylis
Просьба поделиться, как метод 'equals()' переопределяется в 'CaseInsensitiveString'. Вероятно, это связано с тем, что – Savv