toString (), equals () и hashCode () в интерфейсе - PullRequest
51 голосов
/ 12 ноября 2009

Итак, у меня есть интерфейс с кучей методов, которые нужно реализовать, имена методов не имеют значения.

Объекты, которые реализуют этот интерфейс, часто помещаются в коллекции, а также имеют специальный формат toString (), который я хочу, чтобы они использовали.

Итак, я подумал, что было бы удобно поместить hashCode (), equals () и toString () в интерфейс, чтобы убедиться, что я не забыл переопределить метод по умолчанию для них. Но когда я добавил эти методы в интерфейс, IDE / Compiler не будет жаловаться, если у меня не реализованы эти три метода, даже если я явно поместил их в интерфейс.

Почему это не будет навязано мне? Он жалуется, если я не реализую другие методы, но не применяет эти три. Что дает? Любые подсказки?

Ответы [ 12 ]

0 голосов
/ 12 апреля 2013

Абстрактные классы не будут работать, если у вас есть внук, поскольку его отец уже переопределил методы equals и hashCode, и тогда у вас снова возникнет проблема.

Попробуйте использовать аннотатины и APT (http://docs.oracle.com/javase/1.5.0/docs/guide/apt/GettingStarted.html), чтобы сделать это.

0 голосов
/ 12 ноября 2009

хорошо, если вы объявили интерфейс, в котором по умолчанию все методы являются абстрактными, и вам действительно необходимо предоставить функциональность, но когда вы реализуете ее в подклассе, тогда вы предоставляете право реализации. как вы можете видеть, что каждый класс является подклассом одного суперкласса (проще говоря, Object является суперклассом всех классов) так что если у вас есть класс, реализующий интерфейс, вам нужно обеспечить реализацию методов. но здесь нужно помнить кое-что.

независимо от того, если вы не объявили эти методы в интерфейсе, у вас все еще было такое поведение для подкласса, который в первую очередь реализовал интерфейс.

поэтому, если не объявить его, он все равно будет присутствовать, и другое дело в том, что, поскольку эти методы и другие методы класса Object присутствуют для всех объектов классов, нет необходимости в реализации.

...