为什么它在Java7下编译,而不是在Java8下编译?

为什么它在Java7下编译,而不是在Java8下编译?,java,scala,compiler-errors,java-8,scala-collections,Java,Scala,Compiler Errors,Java 8,Scala Collections,对于Java 7和任何版本的Scala库,这似乎都可以编译: public static void main(String[] args) { scala.collection.immutable.Set<String> set = new scala.collection.immutable.HashSet<String>(); Iterator<String> iterator = set.iterator(); } publicstat

对于Java 7和任何版本的Scala库,这似乎都可以编译:

public static void main(String[] args) {
    scala.collection.immutable.Set<String> set = new scala.collection.immutable.HashSet<String>();
    Iterator<String> iterator = set.iterator();
}
publicstaticvoidmain(字符串[]args){
scala.collection.immutable.Set=new scala.collection.immutable.HashSet();
迭代器迭代器=set.Iterator();
}
它还可以使用Java 8和Scala 2.11.5+进行良好编译。但对于Java 8和Scala 2.11.4,Eclipse抱怨:

方法迭代器()对于类型集不明确
我不明白。在某些上下文中,您可能会对选择哪个重载方法产生歧义,但如果您没有传递任何参数,肯定不会

真正奇怪的是,如果我像这样重铸它:

publicstaticvoidmain(字符串[]args){
迭代器迭代器=新的scala.collection.immutable.HashSet().Iterator();
}

然后投诉就消失了。在我看来,这与上面的版本完全相同。那么为什么它现在可以编译呢?

这可能不是严格意义上的Java 8/Scala库问题。这可能与日食有关。您使用的是哪个版本的Eclipse?这听起来有点像Eclipse4.4中的这个问题:

如果我们比较scala.collection.immutable.Set的javap输出,我们会得到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();
}
公共接口scala.collection.immutable.Set:

类签名对有关(可能是泛型的)类声明的类型信息进行编码。它描述类的任何类型参数,并列出其(可能参数化的)direct超类和direct超接口(如果有)。类型参数由其名称描述,后跟任何类边界和接口边界



这一点在中有明确的解释,已在。。。2.11.5

检查scala 2.11.4和2.11.5上“scala.collection.immutable.Set”的API中发生了什么变化?如果是opensource@WvdL没什么变化,这很可能是相关的。我很确定这不是全部。昨天,在一个更复杂的环境中,IntelliJ用基本相同的东西编译了它,但是Maven抱怨道;今天,尝试构造一个最小的示例,我发现Maven编译得很好,但Eclipse会抱怨。越来越奇怪,好地方!我想知道为什么它没有出现在Java7中?可能与Java8中接口方法的默认实现有关。这确实给调用哪个方法带来了潜在的不确定性,我还没有研究它为什么适用于Java7。javac使用所有配置进行编译(java[7,8]scala-libraries-2.11.[4,5])。Java8Eclipse编译器的权限较低。
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();
}