0

そのような構文を持つことの使用法を知りたいです。以下のような簡単なプログラムを書いてみました。

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 の何が問題なのですか?

また、何かを次のように宣言した場合、有効なif構文ですかClass<? extends T>

4

3 に答える 3

5

ArrayListではないからClassです。おそらくあなたは意味しsomeMethod().getClass()ますか?

于 2012-05-13T15:08:31.273 に答える
1

最初のエラー メッセージは、宣言の型パラメーターに由来します。

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

この型Collectionは、Java で「生の型」と呼ばれるものです。これは、インターフェイスCollectionが型パラメーターを受け取りますが、宣言には何も指定されていないためです。の飾り気のない使用にも同じことが当てはまりますArrayList

ただし、宣言は実際には、あなたが思っていることを実行しません...実際には、 という名前の変数を宣言します。これには、 type 、つまり (リフレクション) クラス記述子 (特定の型) のsomeCollectionClassインスタンスを割り当てることができます。Class<? extends Collection>2 番目のエラー メッセージは、コンパイラがそれについて不平を言っているものです: 型ArrayList( によって返されるsomeMethod) のインスタンスを変数に割り当てることはできません。その型は、「Class<...>(クラスを記述する特別な Java ランタイム型である) のインスタンスのみを許可する」と宣言されています。

Collection someCollection = someMethod(); 
于 2012-05-13T15:14:43.577 に答える
0

someMethodがList型のインスタンスを返しています。これを、インスタンスではなくCollectionクラスを期待している変数に割り当てようとしています。次のコードが機能するはずです。

Collection someCollectionClass = someMethod();
于 2012-05-13T15:11:17.737 に答える