SORU
6 EYLÜL 2013, Cuma


Neden diziler ama jenerik olarak tanımlanabilir. kovaryant?

Joshua Bloch tarafından Etkili Java,

  1. Diziler önemli iki genel tür farklıdır. İlk diziler kovaryant. Jenerik değişmez.
  2. Covarient eğer x Y alt sonra ise sadece anlamına gelir [x] de Y alt türü olacak. " dedi. Diziler string Nesnesinin alt türü Olarak covarient

    String[] is subtype of Object[]

    Değişmeyen sadece ne olursa olsun, X Y ya da değil, alt olma anlamına gelir

     List<X> will not be subType ofList<Y>.
    

Benim sorum dizilerde kovaryant kararı Java neden? Why are Arrays invariant, but Lists covariant? gibi mesajlar ÇOK kişi var ama Scala odaklanmış gibi görünüyor ve takip etmek mümkün değil.

CEVAP
6 EYLÜL 2013, Cuma


wikipedia:)

Java sürümleri ve C# jenerik içermiyordu (bir.k.bir. parametrik) polimorfizmi.

Böyle bir ortamda, diziler değişmeyen yapmak yararlı polimorfik programları kaldırıyor. Örneğin, bir dizi, ya da eşitlik elemanları Object.equals yöntemi kullanılarak iki dizi test eden bir fonksiyon karıştırmak için bir fonksiyon yazmak. Uygulama eleman tam tür dizi saklı bağlı değildir, bir dizi türleri üzerinde çalışan tek bir fonksiyon yazmak mümkün olmalıdır. Kolay tür işlevleri gerçekleştirmek için

boolean equalArrays (Object[] a1, Object[] a2);
void shuffleArray(Object[] a);

Eğer dizi türleri değişmeyen olarak tedavi edildi, ancak, sadece tam olarak bu tür bir dizi üzerinde bu fonksiyonlar Object[] aramak mümkün olacaktır. Bir, örneğin, dizeleri bir dizi karışık değil.

Bu nedenle, her ikisi de Java ve C# dizi türleri covariantly tedavi. C örneğin,# string[] Java String[] Object[] çalışmaları devam ediyor object[], ve çalışmaları devam ediyor.

Bu sorunun cevabı "Neden diziler kovaryant?", ya da daha doğrusu, "Nedenedildidiziler kovaryant yaptızamanda?"

Jenerik olarak kullanılmaya başlandı, kasten sebep this answer by Jon Skeet işaret için kovaryant yapılmış:

Hayır, bir List<Dog> List<Animal> değildir. List<Animal> - herhangi bir hayvan ekleyebileceğiniz ile neler yapabileceğini düşünün... bir kedi de dahil olmak üzere. Şimdi, mantıksal olarak yavru bir çöp için kedi ekleyebilir misin? Kesinlikle değil.

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new List<Dog>();
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

Aniden bir varçokkedi kafası karışık.

Diziler kovaryant yapmak için orijinal motivasyon wikipedia makalesinde açıklanan wildcards kovaryans (contravariance) ifadesi mümkün, örneğin yaptığı için jenerik için geçerli değildi:

boolean equalLists(List<?> l1, List<?> l2);
void shuffleList(List<?> l);

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010
  • REK Roth Productions

    REK Roth Pro

    8 Ocak 2011
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009