我有一个相当基本的场景,我使用外部库中的特征,将一个对象添加到该库中的“全局”列表中:
// 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 */ }
})
但它不起作用。
答案 0 :(得分:2)
要回答我自己的问题,我的帖子中的修复不起作用,但这似乎编译成一个正确的形式,适用于两个版本:
trait MyTrait extends LibraryTrait {
def method2() {}
}
class MyClass extends MyTrait {
override def method() = { /* code */
}
list.add(new MyClass)
这是一个“黑客”解决方案 - 意味着它有效,但我不知道为什么如此,如果有人更熟练的编译方式,并能描述字节码的差异(匿名类与此解决方案)我会非常感谢它并接受它作为答案。