为什么在Java 8中方法参数存在未经检查的转换时,返回类型的泛型会被擦除?
为什么在Java 8中方法参数存在未经检查的转换时,返回类型的泛型会被擦除?
考虑以下代码示例:
在Java 7中编译时,对于`getProducer(list)`会产生一个预期的警告:
Warning:(7, 39) java: unchecked conversion required: java.util.Listfound: java.util.List
然而,在Java 8中编译时,对于`response = getProducer(list).get()`分配会产生以下错误:
Error:(7, 48) java: incompatible types: java.lang.Object cannot be converted to java.lang.String
所以显然,从`getProducer(list)`返回的类型不是`Producer
奇怪的是,可以通过避免在调用`getProducer`方法时进行未经检查的转换来修复这个问题,方法如下:
- 将`getProducer`的参数类型从`List
- 将`list`变量的类型从`List`改为`List
更新:
- 使用的Java版本是Oracle JDK 1.8.0_40
- 我还尝试使用Java 8编译器的1.5至1.7的源和目标选项,结果是相同的。
问题:
- 在方法的返回值方法签名中固定了泛型类型的情况下,传递参数的泛型类型如何影响方法返回值的泛型类型?
- 为什么在Java 7和Java 8之间会有这样一种不兼容的行为变化?