2015-12-13 15 views
8

OJCPA kod parçacıklarına bakıyordum ve derleyicinin aşağıdaki kodda neden bir hata atmadığını karıştırıyorum. Genel türlere ham türlerini atarken neden bir derleyici hatası almıyorsunuz?

List l = new ArrayList(); 
l.add("a"); 
l.add("b"); 
l.add(1); 

List<String> strList = new ArrayList<>(); 
strList = l; //#1 - Why does the assignment compile? 

for(String s: strList) { 
     System.out.println(s); //#2 - It makes sense that it then throws a ClassCastException 
} 

Ben> derleyici ham türü olarak Listesi l görecekti ve jenerik değişmez oldukları için < Dize tipi listesi değil gibi, bir derleyici hatası üretir düşündük.

teşekkürler yardımcı için.

cevap

7

Geriye dönük uyumluluk için izin verilir.

Bir ListString lerini döndüren bir miras yöntemini çağırarak olduğunu varsayalım, ama jenerik Java eklenmiştir önce yazılmıştır, bu nedenle ham List döndürür.

List<String> strList = someOldMethodThatReturnsRawList(); 

Aksi takdirde bu yöntemi çağırmak için yeni kodda ham List türünü kullanmaya devam etmek gerekir:

Bu hat derleme geçmek isterdim.

+0

daha fazla bilgi burada https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html – AdamSkywalker

+1

Ben biri için bir kod ya da başka bir sözdizimi göstergesi kodlayıcıya ne olduğunu biliyordu/yapıyordu. Ama zamanla çalıştıkları çeşitli rakip tasarım kriterlerinin farkında değilim, bunun için iyi bir sebebi olduğuna güvenmek zorundayım. :-) –

+0

Herhangi bir ham tipi yazılan sınıfa atayabilir misiniz? – binarycreations

İlgili konular