为什么这个Java 8程序不能编译?

18 浏览
0 Comments

为什么这个Java 8程序不能编译?

这个程序在Java 7中可以编译通过(或在Java 8中使用-source 7编译通过),但在Java 8中无法编译通过:

interface Iface {}
class Impl implements Iface {}
class Acceptor> {
    public Acceptor(T obj) {}
}
public class Main {
    public static void main(String[] args) {
        Acceptor acceptor = new Acceptor<>(new Impl());
    }
}

结果:

Main.java:10: 错误: 不兼容的类型: 无法推断Acceptor<>的类型参数
        Acceptor acceptor = new Acceptor<>(new Impl());
                                           ^
    原因: 推断变量T具有不兼容的边界
      相等性约束: Impl
      上界: Iface,Iface
  其中T是一个类型变量:
    T extends Iface 在Acceptor类中声明
  其中CAP#1是一个新的类型变量:
    CAP#1 extends Iface 来自?
1个错误

换句话说,这是Java 7和8之间的源向后不兼容性。我查阅了Java SE 8和Java SE 7之间的不兼容性列表,但没有找到适合我的问题的内容。

那么,这是一个bug吗?

环境:

$ /usr/lib/jvm/java-8-oracle/bin/java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

0