2013-12-08 3 views
1
public class TowerOfHanoi<E> { 
    private class Disk<T extends Comparable<E>> { 
    } 

    private class Peg<S extends Disk<T extends Comparable<E>>> extends Stack<Disk<T extends Comparable<E>>> { 
    } 
} 

위의 코드에서 다음 컴파일 오류가 발생합니다.자바 내부 클래스에서 바운드 형식 매개 변수를 정의하는 방법

토큰에

구문 오류는 "확장", 나는 페그의 정의를 변경하는 경우 다음과 같이 작동,

그러나 예상 :

private class Peg<T extends Disk<? extends Comparable<E>>> extends Stack<Disk<? extends Comparable<E>>> { 
} 

나는 싶지 않아 와일드 카드를 사용하십시오. 이를 명명 된 매개 변수로 변경하는 방법이 있습니까?

답변

3

그런 제네릭을 사용할 수 없습니다. 바인딩 된 형식이 아닌 형식을 확장 된 형식으로 전달하기 만하면됩니다.

이 컴파일 :

public class TowerOfHanoi<E> { 
    private class Disk<T extends Comparable<E>> { 
    } 

    private class Peg<T extends Disk<Comparable<E>>> extends Stack<Disk<Comparable<E>>> { 
    } 
} 
+0

내 이해는 디스크 <비교 경우에만 해당 받아 들일거야 및 하위 클래스가 있습니다. 내 편집을 참조하십시오. –

+0

아니요. 'Comparable '을 확장하는 모든 클래스를 허용합니다. 'Disk' 구현체는'Disk >'으로 정의 되어야만합니다. 그러나 여러분은'Comparable '의 서브 클래스를 사용할 수 있습니다. – Bohemian

+0

디스크를 비 제네릭 타입으로 만들었습니다. 결국, 이것은 실제 알고리즘보다 시간이 많이 걸렸으므로 불필요하게 복잡해진 것처럼 보였습니다. 나는 당신의 대답을 받아 들일 것입니다. –

1

E을 (를) 비교해 볼 수없는 이유가 있습니까?

public class TowerOfHanoi<E extends Comparable<? super E>> 
{ 
    private class Disk implements Comparable<Disk> { } 

    private class Peg extends Stack<Disk> { } 
} 
+0

내가 그것에 대해 생각하지만 그것이 옳은 일처럼 보이지 않았다. 디스크를 서로 비교할 필요가 있으므로 Disk 클래스 만 유형에 대한 제한을 가하고 TowerOfHanoi의 외부 클래스는 제한하지 않아야한다고 느꼈습니다. 이에 대한 논쟁을 발견하면 알려주세요. –

+0

'TowerOfHanoi '이'Disk '의 인스턴스를 생성하면'E'는 비교 가능해야합니다. – tom

+0

그건 맞지 않아요; 위의 @ Bohemian의 솔루션을 사용하면 E를 비교할 필요없이 작동 할 것입니다. 위의 제 의견에서 언급했듯이 어쨌든 청소를 마쳤습니다. –

관련 문제