2010-12-14 6 views
2

Ok javas generics、iterable、for-eachループに関する質問。問題は、私が 'テスト'クラスの型が宣言されていないと宣言すると、私はすべての私の関数に関するすべての一般的な情報を失い、それぞれのためにはまったく好きではないということです。Javaの型指定されていないジェネリッククラス、それらの関数を削除するジェネリック型

public class Test<T> implements Iterable<Integer>{ 

    public Test() {} 

    public Iterator<Integer> iterator() {return null;} 

    public static void main(String[] args) { 
     Test t = new Test(); 

     //Good, 
     //its returning an Iterator<object> but it automatically changes to Iterator<Integer> 
     Iterator<Integer> it = t.iterator(); 

     //Bad 
     //incompatable types, required Integer, found Object 
     for(Integer i : t){ 
     } 
    }Untyped generic classes losing 
} 

'テストT' が型なしの場合、 'イテレータ()' 関数が返す 'イテレータ' の代わりに 'イテレータ<整数>'。

私はそれの背後にある理由は確かではありませんが、私はそのための修正点は 'Test <'のワイルドカードを使用していることを知っていますか? > t =新しいテスト() 'しかし、これは理想的ではありません。
クラス宣言とその関数を編集し、各ループの作業を型なしにする方法はありますか?

+0

を、メソッドのジェネリック医薬品は、(最新のJavaのpuzzlersの割賦を参照)は無視されます。生の型は使用しないでください。最近のバージョンのjavacは警告を出すべきです。 –

+0

ビデオリンクをありがとう、彼らの非常に興味深いもの。 の背後にある推論は今や意味をなさない。 – user542481

答えて

3

は、あなただけの次の操作を行う必要があります。

public class Test implements Iterable<Integer>{ 

はすべて一緒にジェネリック型を削除します。

Testクラスはまったく一般的ではありません。これは単に汎用インターフェースを実装するだけです。ジェネリック型を宣言する必要はありません。これはまた、あなたが得ていたその一般的な警告を取り除くことの利益をもたらすでしょう。

@Eugeneが良い点です。あなたが実際にジェネリックTestタイプを望んでいた場合は、汎用のイテレータとしてTestを宣言する必要があります。

は、あなただけの、次の操作を行う必要があります。

public class Test implements Iterable<Integer>{ 

はすべて一緒にジェネリック型を削除します。

Testクラスはまったく一般的ではありません。これは単に汎用インターフェースを実装するだけです。ジェネリック型を宣言する必要はありません。これはまた、あなたが得ていたその一般的な警告を取り除くことの利益をもたらすでしょう。

public class Test<T> implements Iterable<T>{ 

そして、あなたはそれをインスタンス化するときにTestジェネリックを作ることを確認してください。コンパイルされます

Test<Integer> t = new Test<Integer>; 

はその後for(Integer i: t)に呼び出します。

2

あなたはどちらか、この記述する必要があります:

public class Test implements Iterable<Integer>{ 
    ... 

か、実際にあなたのクラスをgenerify:あなたは生の型を使用する場合は

public class Test<T> implements Iterable<T> { 

    public Iterator<T> iterator() {return null;} 

    public static void main(String[] args) { 
     Test<Integer> t = new Test<Integer>(); 

     Iterator<Integer> it = t.iterator(); 

     for(Integer i : t){ 
     } 
    } 
} 
+0

ちょうど私が書き始めたもの。 +1 –

+0

うん、それはうまくいくだろうが、あなたのような状況に遭遇することができる。 "public class Vertex はIterable を実装しています。"グラフの例。奇妙ですが、iterableがそれを呼び出すクラスを返さない状況を得ることができます。私のせいで私はそのことをよく説明しなかった。 – user542481

+0

これはまったく異なる質問です。その場合、iterator()メソッドはイテレータ>を返さなければなりません。一方、Iterableの実装を明確にする必要はなく、Iterable の代わりにIterable を実装するより汎用的であると宣言できます。 –

関連する問題