小编A.R*_*A.R的帖子

使用特征,不一致的编译器行为实现抽象方法?

我有一个来自Java库的基类,其代码我无法修改.这个类(A)有一个空方法(b),它应该被声明为abstract:

class A {
  def b { }
}
Run Code Online (Sandbox Code Playgroud)

我在Scala中扩展此类并重写该方法以使其成为抽象:

abstract class AA extends A {
  override def b
}
Run Code Online (Sandbox Code Playgroud)

现在我在一个特征中实现这个方法:

trait B {
  def b { println("B") }
}
Run Code Online (Sandbox Code Playgroud)

如果我用特征B扩展AA,我会得到一个错误:在类A中覆盖方法b => Unit; 特征B中的方法b类型=>单位需要`覆盖'修饰符:

class C extends AA with B {}
Run Code Online (Sandbox Code Playgroud)

相反,如果代码是这样的,那么编译所有内容都没有错误,这对我来说似乎有些矛盾:

abstract class AA {
  def b
}

trait B {
  def b { println("B") }
}

class C extends AA with B {}
Run Code Online (Sandbox Code Playgroud)

我正在运行Scala 2.8.0RC3,并且对语言完全陌生(3天).另一个奇怪的和相关的行为是在制作b abstract时不需要覆盖标签:

abstract class AA extends A {
  def b
}
Run Code Online (Sandbox Code Playgroud)

scala traits

6
推荐指数
2
解决办法
2831
查看次数

标签 统计

scala ×1

traits ×1