2016-06-15 2 views
0

Java에서 라이브러리 관리 응용 프로그램을 구축 중입니다.추상 함수, 매개 변수 유형 확장 클래스

저는 추상 클래스가 Material입니다. 그것에는 equals이라는 추상 메소드가 있습니다.

Newspaper라는 서브 클래스가와 equals 내부 Material가로는 물론 동일한 서명, equals을 구현

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; 
    } 
} 

자바 elementoAComparar의 방법을 확인할 수 없습니다. 그들은 Material을 확장하는 Newspaper에 모두 존재합니다.

나는 약간의 도움이있다. on this thread of SO 그러나 나는 그것을 정말로 만들 수 없다.

나는 실제로 얻지 못하는 것이 일반적인 매개 변수로 작동하는 클래스의 메서드를 사용하는 방법입니다.

나는이가 정말 열심히하지 않습니다 확신하지만 자바 정말 약간의 경험이, 나 너무 열심히하지 마세요 :)

감사합니다!

+0

왜 'equals' 메소드가 클래스를 인수로 사용합니까? – khelwood

+0

그것은 내가하고있는 것을 이해하고 있지 않다는 것을 증명합니다. 나는 실제로 내가하고있는 일을 이해하지만 여전히 내가 한 일을 이해하지 못한다. 나는 실제로 "Class "의 의미를 얻지 못한다. – DavidVV

답변

1

@Ajit George가 언급했듯이, 평등 방법을 구현하려는 경우 더 깨끗한 방법이 있습니다. 그러나 코드를 컴파일하고 실행하기 만하면 메소드의 서명을 변경해야합니다. Java는 elementoAComparar의 메소드를 해석 할 수 없기 때문에 Class에는 Material 메소드가 없습니다. 당신은

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

첫 번째 서명

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

에서 equals 방법 서명을 변경해야합니다

당신이 Class 객체의 인스턴스를 전달합니다 자바를 알려줍니다. 두 번째는 오브젝트의 인스턴스 인 Material을 전달할 것임을 Java에 알립니다.

+0

알았어요. 당신이 나에게 말했듯이 시그니처를 변경하고 Material to 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

관련 문제