2016-06-16 17 views
1

(Wenn diese Forschung, alle fand ich waren SO Beiträge und Webseiten sagen, kann man nicht einfach auf einen generischen Typ umgewandelt Löschung aufgrund Typ, fand ich nichts auf den Punkt.)Typ Sicherheitswarnung, wenn auf generische Art Casting

Kann mir jemand erklären, warum Eclipse mich mit dieser Warnung auffordert?

public <T> T getFromBag(String key, Class<T> clazz) { 
     Object val = null; 
     T typeCastValue = null; 

     if (commonDataBag.containsKey(key)) { 
      val = commonDataBag.get(key); 
      typeCastValue = clazz.cast(val); 
     } 
     return typeCastValue; 
    } 

Verbrauch:

Map<String, Foo> stuff= myService().<Map>getFromBag(key, Map.class); 

Warnung:

Type safety: The expression of type Map needs unchecked conversion to conform to Map<String,Foo> 
+2

Ja, das ist im Grunde unvermeidlich. Sie können 'getFromBag (Schlüssel, Map.class)' aufrufen, aber Sie können Generics nicht verwenden, um zu erzwingen, dass das Ergebnis eine 'Map ' anstelle einer anderen Art von 'Map' ist. –

+1

'Map.class' sagt nicht, um welche Art von' Map' es sich handelt, und so etwas wie 'Map .class' gibt es nicht. –

Antwort

0

Ihr Rückgabewert der Klasse HashMap, gibt es nicht Art und Weise sicher zu sein, dass es HashMap ist, so dass Sie eine Warnung erhalten.

1

Kann mir jemand erklären, warum Eclipse mich mit dieser Warnung auffordert?

In myService().<Map>getFromBag(key, Map.class) stellen Sie einen expliziten Typ Zeuge (<Map>) für die Variable vom Typ T. Daher ist der Rückgabetyp des Anrufs T, also Map. Dann ordnen Sie das (vom Typ Map) dem Typ Map<String, Foo> zu, bei dem es sich um eine ungeprüfte implizite Konvertierung von einem Rohtyp in einen parametrisierten Typ handelt.

0

Stellen Sie sich vor, wenn Sie Code wie dieses:

Map<String, String> map = new HashMap<>(); 
map.put("foo", "bar"); 
commonDataBag.put("42", map); 

Dann rufen Sie:

Map<String, Foo> stuff= myService().<Map>getFromBag("42", Map.class); 
Foo foo = stuff.get("foo"); 

An dieser Stelle Sie eine Classcast bekommen, weil Ihre Karte nicht Foo Werte enthält, es enthält String Werte.

Dies ist der Grund für die Warnung.