tutorial programacion gui framework example create java scala compiler-errors java-8 scala-collections

programacion - ¿Por qué compila esto bajo Java 7 pero no bajo Java 8?



java swing tutorial (2)

Esto puede no ser un problema estrictamente de la biblioteca de Java 8 / Scala. Puede estar relacionado con Eclipse. ¿Qué versión de Eclipse estás usando? Esto suena un poco como este problema en Eclipse 4.4: los genéricos de Java 8 piensan que el método único es ambiguo

Esto parece compilar bien con Java 7, y cualquier versión de las bibliotecas de Scala:

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

También compila bien con Java 8 y Scala 2.11.5+. Pero con Java 8 y Scala 2.11.4, Eclipse se queja:

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

No entiendo esto Puede obtener ambigüedad sobre qué método sobrecargado seleccionar en algunos contextos, pero seguramente no si no está pasando ningún argumento.

Lo realmente extraño es que si lo repito así:

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

entonces la queja desaparece. Esto me parece que es exactamente equivalente a la versión anterior. Entonces, ¿por qué ahora compilaría bien?


Si comparamos la salida javap de scala.collection.immutable.Set , obtenemos para el 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(); }

y para el 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 versión 2.11.4 no es correcta, es una violación de la Especificación de la Máquina Virtual de Java, sección 4.7.9.1 :

Una firma de clase codifica información de tipo sobre una declaración de clase (posiblemente genérica). Describe cualquier tipo de parámetros de la clase y enumera su superclase directa (y posiblemente parametrizada) y sus superinterfaces directas , si corresponde. Un parámetro de tipo se describe por su nombre, seguido de cualquier límite de clase y de interfaz.

Esto se explica claramente en este problema de Scalac , que se ha corregido en el ... 2.11.5