2013-12-08 67 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>>> { 
    } 
} 

通過上面的代碼,我得到了下面的編譯錯誤。如何在Java內部類中定義綁定類型參數

令牌

語法錯誤 「擴展」,預計

但是,如果我改變PEG的定義如下,它的工作原理:

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

我的理解是,Disk 只會接受Comparable 而不是它的任何子類。看我的編輯。 –

+0

不會。它會接受任何延伸「可比較」的課程。 'Disk'實現必須被定義爲'Disk >',但你可以使用'Comparable '的任何子類 – Bohemian

+0

我最終使Disk成爲非泛型類型。最後,這花了更多的時間,實際的算法,所以它看起來像我讓它不必要的複雜。雖然我會接受你的回答。 –

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

這是不正確的;用上面的@波希米亞的解決方案,它可以在不使E可比的情況下工作。無論如何,正如我在上面的評論中提到的那樣,我最終清理了它。 –

相關問題