Java jeneriklerinde '&' ve ',' arasındaki fark nedir?


110

Jenerikler hakkındaki resmi Java öğreticisini okurken, tür bağımsız değişkenini (bu durumda T) bir sınıfı ve / veya daha fazla arabirimi 've' operatörü ( &) ile genişletmek için şu şekilde kısıtlayabileceğinizi öğrendim :

<T extends MyClass & Serializable>

Ben yerini &ile ,(yanlışlıkla ve hala küçük bir uyarı ile, çalışır).

Sorum şu, bu ikisi arasında herhangi bir fark var mı:

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

Ve örnek yöntem:

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'nin bir klavye ve kullandığınızla aynı klavyeyi kullandığını varsayıyorsunuz.
emory

3
@emory Bence bu bile yanlış yön - hata parmaklarında değil beyninde. Benzer şekilde, bir Java kaynak dosyasında 'içe aktarma' yerine 'içerme' kullanmayı denediğiniz gibi. Yanlış yazdınız, çünkü beyniniz size yanlış şeyi yazmanızı söyledi, bu da çeşitli nedenlerle mümkündür.
Nick Pickering

2
@Nicholas Pickering, doğru! Benim için klavye yüzünden değil, beyin yüzünden bir yanlış yazıydı. Bir sınıfın uyguladığı arabirimleri yazdığınızda, bunları virgülle ayırırsınız.
Alin Ciocan

Yanıtlar:


169
<T extends MyClass & Serializable>

Bu, tek tür parametresinin Tgenişlemesi MyClassve olması gerektiğini belirtir Serializable.

<T extends MyClass , Serializable>

Bu , biri çağrılan (genişletilmesi gereken ) ve biri çağrılan (gizlenen - muhtemelen uyarının neden olduğu) iki tür parametresi bildirir .TMyClassSerializablejava.io.Serializable

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.