Scala AbstractMethodError混合嵌套在对象中的特征时-仅当编译和导入时

Scala AbstractMethodError混合嵌套在对象中的特征时-仅当编译和导入时,scala,inheritance,traits,Scala,Inheritance,Traits,考虑以下代码: object Impls { trait ConcreteImpl { type Foo = Int def foo = 1 } } trait Base { type Foo def foo: Foo } 我对这个表达很感兴趣 (new Base with Impls.ConcreteImpl).foo 当我将上述代码粘贴到REPL中,或在工作表中运行它,然后尝试表达式时——没问题,它会按预期打印出res0:Int=1 当我把代码放在一个文

考虑以下代码:

object Impls {
  trait ConcreteImpl {
    type Foo = Int
    def foo = 1
  }
}

trait Base {
  type Foo
  def foo: Foo
}
我对这个表达很感兴趣

(new Base with Impls.ConcreteImpl).foo
当我将上述代码粘贴到REPL中,或在工作表中运行它,然后尝试表达式时——没问题,它会按预期打印出
res0:Int=1

当我把代码放在一个文件中,用scalac编译它,然后在同一个目录中使用REPL中编译的类文件,我得到了相同的结果

但是,当我使用编译后的文件,然后说从REPL

import Impls._
(new Base with ConcreteImpl).foo
它抛出

java.lang.AbstractMethodError: $anon$1.foo()I
如果我将所有代码粘贴到REPL中,并使用导入变量,则不会发生这种情况

这里发生了什么?这是意料之中的行为吗?如果相关,我正在使用

Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45)
这显然是一个错误

如果你:

java.lang.AbstractMethodError: $line13.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1.foo()I
  ... 33 elided

scala> :javap -p $line13.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1
Compiled from "<console>"
public final class $line13.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1 implements p.Base,p.Impls$ConcreteImpl {
  public java.lang.Object foo();
  public $line13.$read$$iw$$iw$$iw$$iw$$iw$$iw$$anon$1();
}
这显然是一个常驻编译器错误。(这些类在这里的包p中。)


编辑:事实上。

由于IDE倾向于使用驻留编译器,因此您可能在IDE中也会遇到这个问题。
scala> (new p.Base with p.Impls.ConcreteImpl).foo // show
//works
res0: Int = 1

scala> import p._
import p._

scala> import Impls._
import Impls._

scala> (new Base with ConcreteImpl).foo // show
// fails
java.lang.AbstractMethodError: $anon$1.foo()I
  ... 33 elided

scala> (new p.Base with p.Impls.ConcreteImpl).foo // show
// also fails
java.lang.AbstractMethodError: $anon$1.foo()I
  ... 33 elided