gpt4 book ai didi

scala - 实现具有特征的抽象方法,编译器行为不一致?

转载 作者:行者123 更新时间:2023-12-04 14:20:02 24 4
gpt4 key购买 nike

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

class A {
def b { }
}

我在 Scala 中扩展了这个类并覆盖了该方法以使其抽象:
abstract class AA extends A {
override def b
}

现在我在一个 trait 中实现这个方法:
trait B {
def b { println("B") }
}

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

相反,如果代码是这样的,那么一切都没有错误地编译,这对我来说似乎有点矛盾:
abstract class AA {
def b
}

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

class C extends AA with B {}

我正在运行 Scala 2.8.0RC3,并且完全不熟悉该语言(3 天)。另一个奇怪且相关的行为是在使 b 抽象时不需要覆盖标签:
abstract class AA extends A {
def b
}

最佳答案

为了尝试看看发生了什么,我尝试了这个:

scala> class A{
| def b{ }
| }
defined class A

scala> abstract class AA extends A{
| override def b
| }
defined class AA

scala> class AAA extends AA{
| def b = println("AAA")
| }
<console>:8: error: overriding method b in class A of type => Unit;
method b needs `override' modifier
def b = println("AAA")
^

显然,问题的根源在于抽象类无法“释放”其父类(super class)中的方法,因为抽象类的子类需要包含“覆盖”修饰符。

关于scala - 实现具有特征的抽象方法,编译器行为不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3174365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com