为什么在Java 8中方法参数存在未经检查的转换时,返回类型的泛型会被擦除?

9 浏览
0 Comments

为什么在Java 8中方法参数存在未经检查的转换时,返回类型的泛型会被擦除?

考虑以下代码示例:

在Java 7中编译时,对于`getProducer(list)`会产生一个预期的警告:

Warning:(7, 39) java: unchecked conversion
  required: java.util.List
  found:    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`,而是被擦除的`Producer`(这也通过IDE的“提取变量”功能得到了确认)。这非常令人困惑,因为`getProducer`方法总是返回`Producer`。

奇怪的是,可以通过避免在调用`getProducer`方法时进行未经检查的转换来修复这个问题,方法如下:

- 将`getProducer`的参数类型从`List`改为`List`

- 将`list`变量的类型从`List`改为`List`

更新:

- 使用的Java版本是Oracle JDK 1.8.0_40

- 我还尝试使用Java 8编译器的1.5至1.7的源和目标选项,结果是相同的。

问题:

- 在方法的返回值方法签名中固定了泛型类型的情况下,传递参数的泛型类型如何影响方法返回值的泛型类型?

- 为什么在Java 7和Java 8之间会有这样一种不兼容的行为变化?

0