2013-05-20 36 views
7

'dan bağımsız jenerik yöntemlerle işlenmemiş türler Bu, chrert'un Generic classes with Collection getter of other types numaralı sorusunu izler. Benim soruya daha iyi bir başlık ile gelip Eğer, düzenlemek için çekinmeyin:Genel türleri

ardından kod dönüş türü T yöntemi ve açıkçası bağımsızdır dönüş türü Collection<String>, başka yöntemle genel sınıf GenericClass<T> içeriyor T.

Şimdi, bir GenericClass (hiçbir zaman yapamayacağımı, yani bu sorunun daha iyi bir teorik soru olduğunu, böylece neler olduğunu anlamaya yardımcı olmak için) başlatırsam, bu yöntemin geliştirilmiş bir döngüye çağrılması işe yaramaz çünkü Tüm genel tür bilgileri, işlenmemiş türleri kullanırken kayboluyor gibi görünüyor. Ama sonra, aynı ödevi bir ödevde çağırırken, işe yaramaz (türün güvensizliğini uyarır, fakat derler).

Benim açımdan, ikisinden biri işe yaramalı ya da her ikisi de çalışmalı. Birinin neden çalıştığını ve diğerinin anlamadığını anlamıyorum. Herhangi bir ipucunuz var mı, yoksa JLS'nin bu davranışı açıklayan kısımlarını biliyor musunuz?

public class GenericClass<T> { 

    T doSomething() { 
     return null; 
    } 

    Collection<String> getCollection() { 
     return Collections.emptyList(); 
    } 

    public static void main(String[] args) { 
     GenericClass raw = new GenericClass(); 
     // This will not compile (Error message below) 
     for (String str : raw.getCollection()) { 
      // Type mismatch: cannot convert from element type Object to String 
     } 
     // This is only a warning: 
     // Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String> 
     Collection<String> coll = raw.getCollection(); 
     for (String string : coll) { 
      // works just fine 
     } 
    } 
} 

birlikte burada kabul cevapla oldukça iyi neler açıklıyor ilgili soru vardır: İlk durumda Why won't this generic java code compile?

cevap

4

, raw.getCollection() ham Collection döndürür. JLS 14.14.2 geliştirilmiş for döngü kontrol türünü belirtir:

(FormalParameter üretiminde) Tip bir başvuru türü ise, TargetType Tip olduğu; aksi halde, TargetType, I, türünün argümanının yakalama dönüşümünün üst sınırı veya I raw ise Object'dir.

açıkça normale gibi bir uyarı ile izin verilen bir genel türü, bir ham türü atıyorsanız, İkinci durumda

(vurgu eklenmiştir).

+0

İkinci durumun vurgusu ve açıklaması, onu mükemmel bir şekilde ortaya koymaktadır. Teşekkür ederim! – jlordo