2016-06-16 5 views
1

(При исследовании этого, все, что я нашел так сообщения и веб-сайты говорят, что вы не можете просто бросить к универсальному типу в зависимости от типа стирания, я ничего не нашел на пункте.)типа при литье для общего типа

Может кто-нибудь объяснить мне, почему Eclipse подсказывает мне это предупреждение?

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; 
    } 

Использование:

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

Предупреждение:

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

Да, это в основном неизбежно. Вы можете вызвать 'getFromBag (key, Map.class)', но вы не можете использовать generics для обеспечения того, что результатом будет «Карта » вместо другого типа «Карта». –

+1

'Map.class' не говорит, что это за« Карта », и нет такой вещи, как« Карта .class'. –

ответ

0

Ваше возвращаемое значение класса HashMap, не существует способа, чтобы быть уверенным, что это HashMap, так что вы получите предупреждение.

1

Может кто-нибудь объяснить мне, почему Eclipse подсказывает мне это предупреждение?

В myService().<Map>getFromBag(key, Map.class), вы предоставляете явное свидетельство типа (<Map>) для типа переменной T. Поэтому возвращаемый тип вызова - T, что составляет Map. Затем вы назначаете это (типа Map) на тип Map<String, Foo>, что является непроверенным неявным преобразованием из необработанного типа в параметризованный тип.

0

Представьте себе, если у вас есть такой код:

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

Тогда звоните по телефону:

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

На этом этапе вы получите ClassCastException, потому что ваша карта не содержит Foo значения, его содержит значения String.

Это то, что подсказывает предупреждение.

Смежные вопросы