2011-08-27 1 views
15

Je voudrais tant plutôt d'écrire ceci:Erreur de compilation: " '<>' ne peut pas être utilisé avec des classes anonymes"

Lists.transform(vals, 
    new Function<>() { 
     public List<ValEntry> apply(Validator<? super T> input) { 
      return input.validate(value); 
     } 
    }); 

... que ceci:

Lists.transform(vals, 
    new Function<Validator<? super T>, List<ValEntry>>() { 
     public List<ValEntry> apply(Validator<? super T> input) { 
      return input.validate(value); 
     } 
    }); 

Mais la Java compilateur me donne le message d'erreur suivant:

'<>' cannot be used with anonymous classes 

y at-il une raison fondamentale pour cela? Ou est-ce que le juste a omis la fonctionnalité dans JDK 7, peut-être qu'ils le font dans 8?

+1

Ne pas se battre avec Java, une meilleure danse avec Scala ... – Landei

+3

Parfois, dans la vie, vous n'avez pas d'autre choix que de se battre . – Lii

+1

Je ne me souviens pas que Java ait été conçu comme un langage fonctionnel – Woot4Moo

Répondre

14

Selon le project coin documentation:

Internally, a Java compiler operates over a richer set of types than those that can be written down explicitly in a Java program. The compiler-internal types which cannot be written in a Java program are called non-denotable types. Non-denotable types can occur as the result of the inference used by diamond. Therefore, using diamond with anonymous inner classes is not supported since doing so in general would require extensions to the class file signature attribute to represent non-denotable types, a de facto JVM change. It is feasible that future platform versions could allow use of diamond when creating an anonymous inner class as long as the inferred type was denotable.

EDIT Il est donc possible dans une future version. Ce n'est toujours pas possible avec Java 8, mais maintenant nous avons des lambdas, donc il y a moins de besoin.

+1

Merci pour la recherche. Les internes des génériques et l'inférence de type sont des choses intéressantes mais compliquées. – Lii

+4

Je ne comprends toujours pas. Pourquoi l'ajout d'un corps de classe à une invocation de constructeur empêche-t-il l'opérateur du diamant de déduire les paramètres de type? 'ArrayList a = new ArrayList <>();' est légal mais 'ArrayList a = new ArrayList <>() {};' ne l'est pas. Le paramètre type est assez clairement 'String'. Pourquoi le fichier de classe pour le type anonyme ne peut-il pas le dire? – thejoshwolfe

+0

Toujours pas possible avec java 8 – gontard

3

Ceci est maintenant prévu pour être inclus dans Java 9. De JEP 213: Milling Project Coin:

  1. Allow diamond with anonymous classes if the argument type of the inferred type is denotable . Because the inferred type using diamond with an anonymous class constructor could be outside of the set of types supported by the signature attribute, using diamond with anonymous classes was disallowed in Java SE 7. As noted in the JSR 334 proposed final draft, it would be possible to ease this restriction if the inferred type was denotable.
Questions connexes