1. ホーム
  2. java

このJava 8のプログラムはなぜコンパイルできないのですか?

2023-09-20 17:05:41

質問

このプログラムは、Java 7(またはJava 8で -source 7 でコンパイルできます)、Java 8 ではコンパイルに失敗します。

interface Iface<T> {}
class Impl implements Iface<Impl> {}

class Acceptor<T extends Iface<T>> {
    public Acceptor(T obj) {}
}

public class Main {
    public static void main(String[] args) {
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
    }
}

結果

Main.java:10: error: incompatible types: cannot infer type arguments for Acceptor<>
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
                                           ^
    reason: inference variable T has incompatible bounds
      equality constraints: Impl
      upper bounds: Iface<CAP#1>,Iface<T>
  where T is a type-variable:
    T extends Iface<T> declared in class Acceptor
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Iface<CAP#1> from capture of ?
1 error

つまり、これは 後ろ向き のソースの非互換性であり、Java 7 と 8 の間の非互換性です。私が行ったのは Java SE 8 と Java SE 7 の間の非互換性 リストを見てみましたが、私の問題に適合するものは見つかりませんでした。

それで、これはバグなのでしょうか?

環境です。

$ /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)

どのように解決するのですか?

ご報告ありがとうございます。これはバグのように見えます。なぜこのようなことが起こるのかについての詳細な情報が得られたら、対処して、おそらくよりよい回答を追加するつもりです。私はこのバグエントリを提出しました。 JDK-8043926 というバグ エントリを作成し、追跡しています。