2017-11-07 1 views
0

여기 처음 질문을 올리므로 모든 것이 올바르게 게시되기를 바랍니다.구현시 제네릭 메소드의 유형을 어떻게 보장합니까?

저는 과제를 수행 중이며이 문제에 조금 갇혀 있습니다. 인터페이스, 모든 인터페이스 GeometricShape를 구현하는 것이 모양 (원형, 원뿔, 구, 및 사각형)의 네 개의 클래스 ....

public interface GeometricShape { 
    public void describe(); 
} 

문제는 (새로운 방법이라는 초대형를 추가 할 수 말한다는)이있는 현재 모양을 취하고 제네릭을 사용하여 크기가 두 배인 동일한 유형의 모양을 반환합니다. 힌트는 다음과 같이 인터페이스를 시작으로 일반화한다고 말합니다.

public interface GeometricShape<T extends GeometricShape<T>> { 
    public void describe(); 
    public T supersize(); 
} 

T는 기하학적 인 모양 일 수 있습니다. 그러나 이렇게하면 Rectangle.supersize()가 원을 반환하는 것이 가능합니다. 이 문제가 발생하지 않도록하려면 어떻게해야합니까 (예 : Rectangle.supersize()는 인터페이스 코드 만 수정하여 Rectangle 만 반환 할 수 있습니까?

답변

1

트릭은 인터페이스 정의가 아니라 클래스 선언에 있습니다. 구형

등으로 정의

public class Rectangle implements GeometricShape<Rectangle> { 
    public void describe() {// do stuff} 
    public Rectangle supersize() { 
     return new Rectangle() 
     //this should fail since you have specified T 
     //return new Circle() 
    } 
} 
관련 문제