2016-06-15 3 views
0

Я создаю приложение управления библиотекой в ​​Java.абстрактная функция, тип параметра extends class

У меня есть абстрактный класс под названием Material. Он имеет абстрактный метод под названием equals.

Существует подкласс называется Newspaper и конечно реализует equals, с точно такой же подписью, как equals имеет внутри Material:

public <T extends Material> boolean equals(Class<T> elementoAComparar) { 
    if (this.getTitulo().equals(elementoAComparar.getTitulo()) && this.getFechaPublicacion().equals(elementoAComparar.getFechaPublicacion())) { 
     return true; 
    } else { 
     return false; 
    } 
} 

Java не может решить любой из методов elementoAComparar. Все они существуют в Newspaper, который распространяется Material.

Я получил некоторую помощь on this thread of SO, но я не могу заставить ее работать.

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

Я уверен, что это на самом деле не так сложно, но у меня действительно мало опыта работы с Java, пожалуйста, не слишком сильно на меня :)

Спасибо!

+0

Почему ваш метод 'equals' принимает класс в качестве аргумента? – khelwood

+0

доказывает, что я не понимал, что делаю. Теперь я действительно понимаю, что я делаю, но все еще не понимаю, что я сделал. Я действительно не понимаю значение «Класс ». – DavidVV

ответ

1

Как сказал @Ajit George, если вы пытаетесь реализовать метод равенства, тогда есть более чистые способы сделать это. Однако, если вы просто хотите, чтобы ваш код компилировался и запускался, вам нужно будет изменить подпись своего метода. Java не может разрешить методы elementoAComparar, потому что Class не имеет этих методов, Material делает.

Вам нужно изменить equals подпись метода из

public <T extends Material> boolean equals(Class<T> elementoAComparar) 

в

public <T extends Material> boolean equals(T elementoAComparar) 

Первая подпись говорит Java, что вы будете проходящее экземпляр из Class объекта. Второй говорит Java, что вы передадите экземпляр объекта, который является Material.

+0

Я понял. Я изменил подпись, как вы мне рассказывали, и передал материал в Periodico (газета на испанском языке), поэтому я действительно имею доступ ко всем ее методам (getFechaPublicacion не находится в Material). – DavidVV

0

две точки:

  • Class объекты представляют собой класс объектов, и equals, как правило, используется для сравнения экземпляров. Ваше объявление equals означает, что вы хотите сравнить этот объект с объектом класса.
  • equals определено по java.lang.Object, которое наследует все объекты. Чтобы ваша реализация сравнения работала с кодом библиотеки Java, вам необходимо переопределить Object.equals. equals предшествует дженерикам в Java, поэтому Object.equals не использует их. Ваша реализация должна проверить сравниваемый экземпляр и применить его к типу вашего объекта, чтобы получить поля другого объекта.

Ответ на вопрос What issues should be considered when overriding equals and hashCode in Java? дает хорошее резюме и демонстрацию.

+0

Вы правы, мне также нужно было передать его моему объекту, иначе у меня нет доступа ко всем методам. Спасибо. – DavidVV

Смежные вопросы