Pourquoi est-ce que Java 8 programme compile pas?

Ce programme compile bien dans Java 7 (ou en Java 8 avec -source 7), mais ne parvient pas à compiler avec 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());
    }
}

Résultat:

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

En d'autres mots, c'est un en arrière source d'incompatibilité entre Java 7 et 8. Je suis passé par Les incompatibilités entre Java SE 8, et Java SE 7 liste, mais n'a pas trouvé quelque chose qui pourrait convenir à mon problème.

Donc, est-ce un bug?

Environnement:

$ /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)
  • Connexes: stackoverflow.com/questions/22509488/...
  • Acceptor<?> acceptor = new Acceptor<Impl>(new Impl()) devrait fonctionner correctement ou Acceptor<Impl> acceptor = new Acceptor<>(new Impl()).
  • Sonne comme un bug pour moi. Ressemble au diamant opérateur est confus.
  • cette compile très bien pour moi. à l'aide de téléchargements à partir de oracle.com/technetwork/articles/java/lambda-1984522.html en janvier
  • Merci de nous montrer votre Java-8-subversion.
  • C'est la compilation pour moi. FWIW (build 1.8.0-b132) Mac OSX
  • Sur Windows à l'aide de construire 1.8.0-b132, je peux reproduire votre erreur de compilation.
  • Je sais comment le contourner, je veux simplement confirmer si c'est un bug.
  • La déclaration semble non-sens de toute façon. Il est étrange que Java 7 permis, et que votre examen du code n'a pas l'attraper.
  • Pourquoi?

InformationsquelleAutor ghik | 2014-04-14