如果我在java
中定义了以下类public class A
{
protected class B
{
}
protected void method(B b) {...}
}
我想在scala和override方法中继承它。我本希望做到以下几点:
class C extends A {
override def method(b: B): Unit = {
// ... do something
super.method(b)
}
}
然而,scala编译器不喜欢我这样做时会出现以下错误:
方法方法不会覆盖任何内容。注意:C类的超类包含以下非最终成员命名方法:protected [package ...] def方法(x $ 1:A#B):单位
我能使其发挥作用的唯一方法是执行以下操作:
class C extends A {
override def method(b: A#B): Unit = {
// ... do something
super.method(b.asInstanceOf[this.B])
}
}
我发现这件事非常难看,并且想知道是否有更简洁的方法吗?
由于
德
答案 0 :(得分:1)
明显的代码对我有用:
public class A {
public class B {}
protected void method(B b) {
System.out.println("A#method");
}
}
class C extends A {
override def method(b: B): Unit = {
println("C#method")
super.method(b)
}
}
然后在sbt控制台中:
scala> new C
res0: C = C@10ecc87a
scala> new res0.B
res1: res0.B = A$B@db9a93b
scala> res0.method(res1)
C#method A$B@db9a93b
A#method A$B@db9a93b
然而,如果我然后修改C.scala并让sbt进行增量重新编译,我会看到你看到的错误(用0.12.4和0.13.0测试) - 它可能是值得的提交有关此事的错误信息。