Ort*_*kni 8 java generics type-inference
我正在阅读来自Mala Gupta的OCP Java SE7认证指南.在页297,以下代码段
import java.util.HashMap;
import java.util.Map;
public class TestGenericTypeInference {
Map<String,Double> salaryMap = new HashMap<>();
Map<String,Object> copySalaryMap = new HashMap<>(salaryMap);
}
Run Code Online (Sandbox Code Playgroud)
正在使用java 8进行编译,但是使用java 7,编译器会抱怨:
TestGenericTypeInference.java:8: error: incompatible types: HashMap<String,Double> cannot be converted to Map<String,Object>
Map<String,Object> copySalaryMap = new HashMap<>(salaryMap);
^
Run Code Online (Sandbox Code Playgroud)
我的问题是:类型推断算法的哪些变化会导致这种行为?
我的问题的答案:
类型推断算法的哪些变化导致了这种行为?
位于 Angelina Langer 的仿制药常见问题解答中。给出了一个类似的例子:
// error in Java 7 ; fine since Java 8
Set<Number> s3 = new HashSet<>(Arrays.asList(0L,0L));
Run Code Online (Sandbox Code Playgroud)
- [...] 表达式表明赋值的左侧确实被忽略(在 Java 7 中)。编译器再次从构造函数参数(即 asList 方法的结果)推断新 HashSet 缺少的类型参数必须是 Long 。这会导致类型不匹配和相应的错误消息。编译器不会断定缺少的类型参数应该是 Number,因为它忽略了赋值的左侧。 在Java 8中,类型推断被修改和改进。从那时起,编译器将 Number 推断为编译器右侧新 HashSet 的类型参数,并从中推断出 Number 作为 asList 方法的类型参数。在 Java 8 中,编译得很好。