SORU
2 EKİM 2010, CUMARTESİ


java süper kelime jenerik

Bu konuları inceledim

Ancak, ben yine de super anahtar kelime ile kayıp gibi görünüyor:

  1. Böyle bir toplama ilan ediyoruz

    List<? super Number> list = null;
    list.add(new Integer(0));//this compiles
    list.add(new Object());//this doesn't compile
    

    bunun tersi - Number ebeveynleri olan bazı nesneler (bilinmeyen) içeren bir liste var olmamalı. Object uyar Number üst beri), ve Integer olmamalı. Tam tersi nedense böyledir.

  2. Aşağıdaki kodu olması koşuluyla

    static void test(List<? super Number> param) {
        param.add(new Integer(2));
    }
    public static void main(String[] args) {
        ArrayList<String> sList = new ArrayList<String>();
        test(sList);            //will never compile, however...
    }
    

    İmkansız yukarıdaki kodu (ve akıl sağlığım bu doğru bir davranış olduğunu göstermektedir) derlemek için, ama temel mantık aksini ispat edebilir:

    String is Object, Object is superclass of Number. So String should work.

    Bu delilik ama <S super T> yapıları izin vermediler neden bu yüzden mi biliyorum? Evet, neden <? super T> izin verilir?

Biri bana bu mantık zinciri eksik olan parçaları geri yüklemek için yardımcı olabilir mi?

CEVAP
2 EKİM 2010, CUMARTESİ


List<? super Number> sınırlı joker Number ve supertypes herhangi yakalayabilir. Number extends Object implements Serializable bunun için şu anda List<? super Number> ile yakalama-Cabrio tek tip olduğu anlamına gelir:

  • List<Number>
  • List<Object>
  • List<Serializable>

add(Integer.valueOf(0)) yukarıdaki türlerden biri için unutmayın. ancak, senOLAMAZGenel tür güvenlik kuralı ihlal eden add(new Object()) List<Number> List<Serializable> beri.

DolayısıylaDEĞİLsadece ne kadar sınırlı olmadığını List<? super Number>; joker ve yakalama dönüşüm çalışma add Number herhangi bir supertype bildiğiniz doğru. Object eklemek isteyebilirsiniz, çünkü List<? super Number> bir beyan yok (!); senin için Number nesneleri "" Number) ve List<Number> çok kısıtlayıcı bir sadece. bir tüketici (yani eklemek istediğin için yap

Referanslar

Ayrıca Bkz

  • Effective Java 2nd Edition Madde 28: sınırlı joker API esneklik artırmak için Kullanın
    • "PECS yapımcı-extends tüketici-super anlamına gelir

İlgili sorular

  • Listelemek için çok fazla,, new Integer(0) vs valueOf, vb . PECS

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006
  • Crossover

    Crossover

    18 HAZİRAN 2007