2012-05-13 10 views
0

このような構文を使用する方法がわかりたいと思います。私は以下のように簡単なプログラム、それはのようにコンパイルエラーを示しなぜクラス<? extends T>用法

public class Sample{ 

    public static void main(String[] args) { 
     Class<? extends Collection> someCollectionClass = someMethod(); 
    } 

    public static ArrayList someMethod() { 
     return new ArrayList(); 
    } 
} 

- Collection is a raw type. References to generic type Collection<E> should be 
parameterized 
- Type mismatch: cannot convert from ArrayList to Class<? extends Collection> 

ここでは、そのクラスは、(それがノウハウを受け入れることを、そのオブジェクトを実際にクラスを期待していないと書かれている、それはです?)コレクションを拡張します。だからArrayListには何が間違っていますか? ArrayListClassではありませんので、私はClass<? extends T>

+0

あなたはクラス ''として何かを宣言することができますが、それはJavaで任意のオブジェクトを参照していない、それはクラスが 'Object'が何のためにあるのかだ詳細についてはこちらをご覧ください:のhttp:/ /docs.oracle.com/javase/6/docs/api/java/lang/Class.htmlを参照してください。しかし、 'Class'は実際の実装と詳細を参照します。 – dcpomero

答えて

1

最初のエラーメッセージは、あなたの宣言内の型パラメータから茎宣言には何も記されていない。同じことがArrayListの飾られていない使用にも当てはまります。

しかし、宣言では実際にはそうは思いません...実際にはsomeCollectionClassという変数を宣言しています。この変数には、タイプClass<? extends Collection>のインスタンス、つまり(リフレクション)クラス記述子を割り当てることができます特定のタイプ)。 2番目のエラーメッセージは、コンパイラがそれに不満を表明しています。ArrayListsomeMethodが返す)のインスタンスは、「Class<...>のインスタンスのみを許可する」という型が宣言されている変数に割り当てることはできません。クラス)

Collection someCollection = someMethod(); 
+0

このような構文の実際の使用方法はどうですか?コレクション>? – Harshana

5

として何かを宣言した場合

また、それは、もし有効な構文です。おそらくsomeMethod().getClass()を意味しますか?

0

someMethodはList型のインスタンスを返していますが、インスタンスではなくCollectionクラスを予期している変数に代入しようとしています。次のコードは動作するはずです。インタフェースCollectionは型パラメータを取るため

Class<? extends Collection> someCollectionClass = someMethod(); 

タイプCollectionは、Javaで「生タイプ」と呼ばれるものである。

Collection someCollectionClass = someMethod(); 
関連する問題