SORU
12 Kasım 2010, Cuma


Java 7 diamond operatörünün anlamı nedir?

Java 7 elmas operatörü aşağıdaki gibi bir kod sağlar:

List<String> list = new LinkedList<>();

Ancak Java 5/6, sadece yazabilirim:

List<String> list = new LinkedList();

Tür silme benim anladığım bu tam olarak aynıdır. (Genel zaten zamanı) kaldırıldı.

Neden elmas ile rahatsız? Yeni işlevsellik / tür güvenlik buna izin nedir? Eğer herhangi bir yeni işlev verim değil mi neden bir özellik olarak söz ediyorlar? Bu kavram benim anlayışı kusurludur?

CEVAP
12 Kasım 2010, Cuma


Sorun

List<String> list = new LinkedList();

Sol tarafta, kullanıyorsunuzjenerikyazın sağ tarafta kullandığınız 8**hamtürü LinkedList. Java Raw türlerini etkili bir şekilde sadece ön jenerik kodu ile uyumluluk için vardır ve asla yeni bir kod yoksa kullanılmalıdır kesinlikle yapman gerek.

Şimdi, Eğer Java vardı jenerik başından ve yoktu türleri gibi LinkedList o vardı, aslında yaratmadan önce vardı jenerik, muhtemelen yapmış olabilir bu çok yapıcı bir genel tür otomatik olarak algılar kendi tür parametreleri Sol tarafta atama mümkünse. Ama yok, ham tedavi etmek gerekir ve genel türler farklı geriye uyumluluk için gelmedi. Bunu yapmak için onlara ihtiyacı bırakırbiraz farklıama yazın parametrelerini tekrar etmeye gerek kalmadan genel bir nesnenin yeni bir örneğini bildirmek için eşit derecede uygun şekilde... elmas operatör.

Bildiğim kadarıyla List<String> list = new LinkedList(), derleyici orijinal örnek olmalı, çünkü bu görev için bir uyarı oluşturur. Bu göz önünde bulundurun:

List<String> strings = ... // some list that contains some strings

// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);

Jenerik derleme zamanı yanlış bir şey yaparak karşı koruma sağlamak için var. Yukarıdaki örnekte, ham türünü kullanarak bu güvenlik sorununuz yok demektir ve çalışma zamanında bir hata iletisi alırsınız. Bu raw türlerini kullanmalısınız.

// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);

Elmas operatör, ancak atamanın sağ tarafında aynı tip sol yanı parametreleri ile doğru genel bir örneği olarak tanımlanan... bu parametreleri tekrar yazmak zorunda kalmadan sağlar. Seninle jenerik güvenliği kalmasını sağlarneredeyseraw türünü kullanarak aynı çaba.

Anlamak için önemli şey çiğ türleri (<>) genel türler aynı tedavi edilemez olduğunu düşünüyorum. Ham bir türü bildirdiğinizde, yararları ve tip kontrol jenerik havanı alırsın. Sen de bunu aklında tutjenerik genel amaçlı Java dilinin bir parçası... sadece Collections-arg hayır kurucular için geçerli değil!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • colacas

    colacas

    29 EKİM 2006
  • Myron and Nejusha dance

    Myron and Ne

    2 AĞUSTOS 2012