Javaジェネリックの「&」と「、」の違いは何ですか?


110

ジェネリックスに関するJava公式チュートリアルを読んでいるときに、型引数(この場合はT)を制限して、次のように「and」演算子(&)でクラスやインターフェイスを拡張できることがわかりました。

<T extends MyClass & Serializable>

私は交換し&,(誤って、まだマイナー警告で、動作します)。

私の質問は、これら2つの間に違いはありますか?

<T extends MyClass & Serializable>
<T extends MyClass , Serializable> // here is with comma

そして、例の方法:

static <T extends MyClass & Serializable> ArrayList<T> fromArrayToCollection(T[] a) {
    ArrayList<T> arr = new ArrayList<T>();

    for (T o : a) {
        arr.add(o); // Correct
    }
    return arr;
}

5
@Doorknobは、OPがキーボードと同じキーボードを使用していると想定しています。
emory 2013

3
@emory私はそれが間違っていると思います-エラーは彼の指ではなく彼の脳にありました。同様に、Javaソースファイルで「インポート」の代わりに「インクルード」を使用しようとした場合と同様です。あなたはあなたの脳が間違ったものをタイプするようにあなたに言ったので、あなたは 'include'をタイプミスしました、これは様々な理由で可能です。
Nick Pickering

2
@ニコラス・ピカリング、そうです!私にとっては、キーボードのせいではなくタイプミスのせいでした。クラスが実装するインターフェースを記述するときは、それらをコンマで区切ります。
Alin Ciocan 2013

回答:


169
<T extends MyClass & Serializable>

これは、単一の型パラメーターTが拡張さMyClassれなければならず、それがでなければならないことを表明していますSerializable

<T extends MyClass , Serializable>

これは2つのタイプパラメータを宣言します。1つは呼び出されT(拡張する必要がありますMyClass)、もう1つは呼び出されますSerializable(非表示になります。java.io.Serializableこれはおそらく警告に関するものです)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.