2017-07-21 15 views
1

静的なネストしたクラスを使用すると、警告が表示されませんThe type parameter T is hiding the type T。しかし、私がを非スタティックのネストしたクラスを使用すると警告が表示されます。私は静的ネストされたクラスを使用すると、私が知りたい静的/非静的内部クラス:タイプパラメータTがタイプを隠しています

public class CustomStack<T> { 
    private class CustomNode<T>{ 
     private T data; 
     private CustomNode<T> next; 

     public CustomNode(T data){ 
      this.data = data; 
     } 

    } 
} 

、なぜ私はこの警告を得ることはありませんか?

答えて

2

インナークラスは、そのクラスを含むクラスへの参照を持ちます。 その参照を通じて、内部クラスは外部クラスで定義された値Tを使用できます。 例えば、これはコンパイルしません:

public class CustomStack<T> { 
    private class CustomNode { 
     private T data; 
     private CustomNode next; 

     public CustomNode(T data) { 
     this.data = data; 
     } 
    } 
    } 

あなたは内部クラスstaticを作る場合、それはもはやそれがコンパイルされません、外側のクラスで定義されTを使用することができます。

投稿されたコードでは、内部クラスのパラメータが外部クラスのTを再定義します。 これは混乱しています。読者は、Tはファイル内で同じことを意味すると考えるかもしれないが、そうではないと考えるかもしれないからです。 内部クラスの内部で使用すると、別の意味があります。

あなたは内部クラスを作成する場合、それは、あなたが例えば、異なっそれを呼び出す必要が独自の型パラメータ、 だ持っている:

public class CustomStack<T> { 
    private class CustomNode<U> { 
     private U data; 
     private CustomNode<U> next; 

     public CustomNode(U data) { 
      this.data = data; 
     } 
    } 
} 
+0

ありがとうございました! –

+0

@JohnRambo良い編集、ありがとう! – janos

0

Tが(冗長性を気)パラメータ化するために使用されているタイプパラメータをインスタンスあなたの外のクラスの。内部クラスはインスタンスにバインドされているため、警告になります。 contraireの静的内部クラスは、いずれのインスタンスにもバインドされていません。静的とは、内部クラスが、宣言されているインスタンスが基本的に独立していることを意味します。

関連する問題