Apa perbedaan antara '&' dan ',' di Java generics?

110

Saat membaca tutorial resmi Java tentang generik, saya menemukan bahwa Anda dapat membatasi argumen type (dalam hal ini adalah T) untuk memperluas kelas dan / atau lebih banyak antarmuka dengan operator 'dan' ( &) seperti ini:

<T extends MyClass & Serializable>

Saya mengganti &dengan ,(secara tidak sengaja dan masih berfungsi, dengan peringatan kecil).

Pertanyaan saya adalah, apakah ada perbedaan antara keduanya:

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

Dan contoh metode:

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;
}
Alin Ciocan
sumber
5
@Doorknob Anda mengasumsikan OP menggunakan keyboard dan keyboard yang sama dengan yang Anda gunakan.
emory
3
@emory Saya pikir bahkan itu salah arah - kesalahannya bukan di jarinya tapi di otaknya. Sama seperti jika Anda mencoba menggunakan 'sertakan' alih-alih 'impor' dalam file sumber Java. Anda salah mengetik 'termasuk', karena otak Anda menyuruh Anda mengetik hal yang salah, yang mungkin terjadi karena berbagai alasan.
Nick Pickering
2
@Nicholas Pickering, benar! Bagi saya, itu bukan salah ketik karena keyboardnya, tapi karena otaknya. Saat Anda menulis antarmuka mana yang diimplementasikan kelas, Anda memisahkannya dengan koma.
Alin Ciocan

Jawaban:

169
<T extends MyClass & Serializable>

Ini menegaskan bahwa parameter tipe tunggal Tharus diperpanjang MyClassdan harus Serializable.

<T extends MyClass , Serializable>

Ini mendeklarasikan dua tipe parameter, satu dipanggil T(yang harus diperluas MyClass) dan yang lain disebut Serializable(yang menyembunyikan java.io.Serializable- mungkin inilah peringatannya).

arshajii
sumber