2015-05-21 25 views
18

Questo sembra per compilare bene con Java 7, e qualsiasi versione delle librerie Scala:Perché viene compilato in Java 7 ma non in Java 8?

public static void main(String[] args) { 
    scala.collection.immutable.Set<String> set = new scala.collection.immutable.HashSet<String>(); 
    Iterator<String> iterator = set.iterator(); 
} 

compila anche bene con Java 8 e Scala 2.11.5+. Ma con Java 8 e Scala 2.11.4, Eclipse si lamenta:

The method iterator() is ambiguous for the type Set<String> 

Non capisco. Si potrebbe ottenere l'ambiguità su quale metodo sovraccarico selezionare in alcuni contesti, ma sicuramente non se non si passano argomenti?

La cosa veramente strana è che se io rifusione in questo modo:

public static void main(String[] args) { 
    Iterator<String> iterator = new scala.collection.immutable.HashSet<String>().iterator(); 
} 

poi la denuncia va via. Questo mi sembra esattamente equivalente alla versione precedente. Allora perché dovrebbe compilare bene?

+0

cosa è cambiato nel API di 'scala.collection.immutable.Set' su Scala 2.11 .4 e 2.11.5? se è opensource –

+1

@WvdL non è cambiato nulla. – mkrakhin

risposta

8

Se confrontiamo l'uscita javap di scala.collection.immutable.Set, otteniamo per la 2.11.4:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A>, 
     scala.collection.generic.GenericSetTemplate<A, 
     scala.collection.immutable.Set>, 
     scala.collection.SetLike<A, scala.collection.immutable.Set<A>>, 
     scala.collection.Parallelizable<A, 
     scala.collection.parallel.immutable.ParSet<A>> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 

e per la 2.11.5:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 

la versione 2.11.4 non è corretto, è una violazione della Java virtuale specifiche della macchina, section 4.7.9.1:

Una firma classe codifica immettere informazioni su una (possibilmente generica) dichiarazione di classe. Descrive eventuali parametri di tipo della classe, ed elenca i suoi (possibilmente con parametri) diretti superclasse e diretti superinterfacce, se presenti. Un parametro di tipo è descritto dal suo nome, seguito da qualsiasi limite di classe e limiti di interfaccia.


Questo è chiaramente spiegato in this scalac issue, che sono stati fissati in ... 2.11.5 controllo

+0

! Mi chiedo perché non emerge in Java 7? Forse qualcosa a che fare con le implementazioni di default dei metodi di interfaccia in Java 8. Ciò dà una potenziale fonte di ambiguità con la quale metodo deve essere invocato. –

+1

non ho indagato perché funziona con Java 7. javac compila con tutte le configurazioni (java [7,8] Scala-librerie-2.11. [4,5]). Il compilatore java 8 eclipse è meno permissivo. – gontard

5

Questo non può essere un Java 8/Scala problema strettamente biblioteca. Potrebbe essere correlato a Eclipse. Quale versione di Eclipse stai usando? Questo suona un po 'come questo problema in Eclipse 4.4: Java 8 generics thinks single method is ambiguous

+0

Sto usando 4.4.2. –

+0

Questo potrebbe essere correlato. Sono abbastanza sicuro che non è tutta la storia. Ieri, con essenzialmente la stessa cosa ma in un contesto più complicato, IntelliJ lo ha compilato bene ma Maven si è lamentato; oggi, cercando di costruire un esempio minimo, ho trovato che Maven lo compila bene ma Eclipse si lamenta. Più strano e più strano. –

+3

Non spiega perché funziona con il Buon punto 2.11.5 – gontard