2017-03-14 2 views
0

Listというパラメータを持つメソッドがあります。インターフェイスを使用するとリストキャストエラーが発生する

private static void setData(List<IData> list) { 

} 

interface IData

public interface IData { 
    int getData(); 
} 

であると私は、私はメソッドを呼び出すためにリストのパラメータを使用するときに問題があるIData

public class Data implements IData{ 

    @Override 
    public int getData() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

} 

のインタフェースをimplementsDataという名前のクラスを持っていますコンパイルに失敗します。

public class Test { 
    public static void main(String[] args) { 
     List<Data> temp = new ArrayList<>(); 
     for (int i = 0; i < 5; i++) { 
      temp.add(new Data()); 
     } 
     setData(temp); 

     List<IData> temp2 = new ArrayList<>(); 
     for (int i = 0; i < 5; i++) { 
      temp2.add(new Data()); 
     } 
     setData(temp2); 
    } 

    private static void setData(List<IData> list) { 

    } 
} 

setData(temp)がエラーです。 setData(temp2)は問題ありません。どちらのリストも同じ内容です。わかりません。サブタイプのインスタンスも、スーパータイプのインスタンスです:サブタイプががある-関係を確立するので

+1

[上限](https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html)、つまり 'setData(List <?extends IData> list)' – TNT

+0

を使用することができます'private static void setData(List <?extends IData> list){'しかし、これはあなたの実装に影響を与えるかもしれません、私は 'List 'を 'List ' – MadProgrammer

+0

に変更するだけです。ジェネリック、継承、およびサブタイプ化に必要な基礎を得た人。その土台でさえ、微妙な獣です。 –

答えて

1

はあなただけ、引数としてのパラメータのサブタイプを置くことができます。内容が何であるかはあなたのリストに関係なく、期待されるパラメーターのタイプに相対して、リストのタイプだけが重要です。あなたのメソッドsetData(List<IData> list)には、が-List<IData>という引数が必要ですが、List<Data>List<IData>のサブタイプではありません)を渡そうとしました。したがって、コンパイラはコードを受け入れることができませんでした。

ジェネリック、継承、およびサブタイプは、「ジェネリック、継承、およびサブタイプ」と題されたJavaチュートリアルのトピックのトピックです。これは、トピックの紹介としてお勧めします。より深い知識は、ジェネリックスに関連するアンジェリカ・ランガーの優れたウェブサイトの熟読によって得られます。私もあなたの注意を喚起します。

関連する問題