public class ExplicitTypeSpecification {
static void f(Map<Integer, String> map){}
public static void main(String[] args){
New c = new New();
f(c.map());
}
}
class New <K, V>{
Map<K, V> map(){
return new HashMap<K, V>();
}
}
Этот код компилируется без ошибок.Параметрированный класс с параметризованным методом
Затем мы делаем некоторые изменения в классе новых:
class New {
<K, V>Map<K, V> map(){
return new HashMap<K, V>();
}
}
Мы параметрироваться только метод map()
, но не весь класс. Но в этом случае ошибка компиляции в встречается, линии f(c.map());
:
java: f(java.util.Map<java.lang.Integer,java.lang.String>) in
Generics.ExplicitTypeSpecification.ExplicitTypeSpecification cannot be applied to
(java.util.Map<java.lang.Object,java.lang.Object>)*
Мы можем указать явные типы f(c.<Integer, String>map());
но я заинтересован в Почему мы получим ошибку компиляции?.
В обоих случаях метод map()
возвращает Map<Object, Object>
объект, но в первом случае мы получаем только предупреждение о непроверенной задаче.
Вопрос: почему во втором случае у нас более строгий контроль типа?
Что такое dirrefence между new HashMap()
и новыми HashMap<Object, Object>()
? Ответ на эту проблему решает.
Интересный вывод, тем более, что 'Map map = c.map(); f (map); 'компилируется. Я думаю, что это имеет какое-то отношение к способности компилятора угадать правильные значения для 'K' и' V'. –
Cephalopod