由于特征上缺少方法而导致的AbstractMethodError(库更新)

时间:2016-08-21 11:47:51

标签: scala

我有一个相当基本的场景,我使用外部库中的特征,将一个对象添加到该库中的“全局”列表中:

// my code, list is a Seq in an object from the external library
list.add(new LibraryTrait(){ override def method() = { /* code */ } })

// from an external library, version used at compile time
trait LibraryTrait {
    def method() = {}
}

// from an external library, version used at runtime
trait LibraryTrait {
    def method() = {}
    def method2() = {}
}

在运行时,它失败了AbstractMethodError,因为我正在创建的匿名类缺少method2(),而我在运行时使用的库正在调用list.foreach(x -> x.method2())。< / p>

除了针对运行时使用的版本进行编译之外,还有什么我可以做的吗?

不是scala编译器专家我尝试将代码更改为此(希望它能正确添加方法):

list.add(new LibraryTrait(){ 
    override def method() = { /* code */ } 
    def method2() = { /* code */ } 
})

但它不起作用。

1 个答案:

答案 0 :(得分:2)

要回答我自己的问题,我的帖子中的修复不起作用,但这似乎编译成一个正确的形式,适用于两个版本:

trait MyTrait extends LibraryTrait {
  def method2() {}
}

class MyClass extends MyTrait {
  override def method() = { /* code */ 
}

list.add(new MyClass)

这是一个“黑客”解决方案 - 意味着它有效,但我不知道为什么如此,如果有人更熟练的编译方式,并能描述字节码的差异(匿名类与此解决方案)我会非常感谢它并接受它作为答案。