在 Scala 中,假设类 A 和 B 有一个公共方法,但没有继承任何公共接口:
class A {
def foo() {
println("A.foo")
}
}
class B {
def foo() {
println("B.foo")
}
}
我想要做的是定义一个扩展任何具有foo()
方法的类的特征。我试过这个:
type Fooable = {
def foo()
}
trait Q extends Fooable {
override def foo() {
println("before super.foo")
super.foo()
println("after super.foo")
}
}
(new A with Q).foo()
(new B with Q).foo()
但是,Scala 编译器拒绝此代码并出现错误:
error: class type required but AnyRef{def foo(): Unit} found trait Q extends Fooable {
最好的解决方案是制作一个包含常用方法的接口,并修改类 A 和 B 以继承该接口。不幸的是,我们无法修改这些类。这在 Java 库中很常见,例如:
java.sql.Connection.close()
和java.io.Closeable.close()
android.app.Activity.onDestroy()
和android.app.Service.onDestroy()