세 가지 해결책이 있습니다.
해결 방법 1
첫째, 당신은, 당신의 클래스를 일반적인 할 수 있도록 같은 :
public class PersonalContact extends Contact<Birthday> {
public Set<Birthday> getEventsWithinPeriod(DateTime start, DateTime end) { ... }
}
이 최고의 솔루션입니다 : 당신의 구체적인 구현 다음
public abstract class Contact<E extends Event> {
// ...
public abstract Set<E> getEventsWithinPeriod(DateTime start, DateTime end);
}
그리고 하지만 몇 가지 대안이 있습니다.
당신은 당신의 birthdaysThatAreWithin
필드의 유형을 변경할 수 2
솔루션 :
Set<Event> birthdaysThatAreWithin = new TreeSet<Event>();
을뿐만 아니라 메소드 서명을 변경
public Set<Event> getEventsWithinPeriod(DateTime start, DateTime end) {
을 그처럼 돌아갑니다. 이벤트를 더 이상 Birthday
인스턴스로 사용할 수 없으므로 제한됩니다.
public Set<? extends Event> getEventsWithinPeriod(DateTime start, DateTime end)
을하고 무엇을 변경하지 :
해결 방법 3
당신은이에 (모두 당신의 추상과 구상 클래스에서) 당신의 방법 서명을 변경할 수 있습니다. 이는 솔루션 2와 동일한 문제를 가지고 있습니다. 이벤트를 캐스팅하지 않고 Birthday
인스턴스로 사용할 수 없습니다.
편집 : 아래쪽의 2와 3은 캐스팅이 필요하다는 것입니다. 예를 들어 최초의 솔루션으로
PersonalContact contact = ... ;
Set<Event> events = personalContact.getEventsWithinPeriod(start, end);
// I know all the events are birthdays, but I still have to do this:
for (Event event : events) {
if (event instanceof Birthday) {
Birthday birthday = (Birthday) event;
// Do stuff with birthday
} // else maybe log some error or something
}
, 당신이이있을 것이다 :
PersonalContact contact = ... ;
Set<Birthday> birthdays = personalContact.getEventsWithinPeriod(start, end);
for (Birthday birthday : birthdays) {
// Do stuff with birthday
}
를 코드는 청소기 모양과 당신이 instanceof
검사를 할 필요가 없기 때문에 돈 당신을 확인하는 것이 좋습니다 실행 ClassCastException
이 표시됩니다.
public static void processBirthdaysFor(Contact<Birthday> birthdayContact, DateTime start, DateTime end) {
Set<Birthday> birthdays = personalContact.getEventsWithinPeriod(start, end);
for (Birthday birthday : birthdays) {
// Do stuff with birthday
}
}
을 그리고 당신이 이제까지 Birthday
이벤트가 Contact
의 다른 구현이있는 경우, 당신은 변경하지 않고 그 processBirthdaysFor
메소드에 전달할 수 있습니다 : 당신은 또한이 같은 물건을 할 수 있습니다. 당신이 이벤트 만이 필요하고 당신이 유형의 호출 코드에서 어떤 상관 없어 경우
, 당신의 Contact.getEventsWithinPeriod
, 다음 솔루션 2와 3은 확실히 당신의 최상의 선택이다. 나는 이것이 상황이라면 개인적으로 단지 해결책 2를 사용할 것입니다.
왜 '이벤트'인터페이스를 계속 사용하고 싶지 않으십니까? 구현을위한 가시적 인 메소드 목록을 정의하여 코드를 명확하게 만드는 인터페이스의 주요 아이디어.'TreeSet' –
을 사용하십시오. 나는 완전히 동의합니다. @ Fess - "getEvents ..."가 Events를 반환한다는 것은 분명합니다. 이 경우 제네릭을 사용하는 것은 혼란스럽고 도움이되지 않습니다. –
네, 맞습니다. 나는 그런 식으로 끝내게되었습니다. 인터페이스가 배너 "이벤트"아래에서 동일한 유형으로 통합 할 수있는 방법을 명확하게 이해하지 못했습니다. 당신의 도움을 주셔서 감사합니다! – CodyBugstein