gpt4 book ai didi

scala - 为什么在两种情况下在特征中使用抽象修饰符时编译器会提示?

转载 作者:行者123 更新时间:2023-12-03 03:46:17 24 4
gpt4 key购买 nike

我正在练习在线书籍《Scala 1ed 编程》中有关特质的章节。

http://www.artima.com/pins1ed/traits.html

有两个例子可以展示traits的威力,分别是丰富的瘦接口(interface)和可堆叠的修改。这是实现的片段

// example 1
trait Relation[T]
{
def compare(that: T): Int

def <(that: T) = compare(that) < 0
def >(that: T) = compare(that) > 0
def <=(that: T) = compare(that) <= 0
def >=(that: T) = compare(that) >= 0
}

// example 2
trait Doubling extends IntQueue
{
abstract override def put(a: Int) { super.put(a*2) }
}

上面的代码可以编译。

我很好奇abstract修饰符的存在,所以首先我在Relation::compare()前面添加了abstract修饰符在示例 1 中。也许将 abstract 标记为 compare 是合理的,它将被子类覆盖。

// case 1
abstract def compare(that: T): Int

然后编译器提示

Error:(19, 16) `abstract' modifier can be used only for classes; it should be omitted for abstract members
abstract def compare(that: T): Int
^

我认为这条消息说它不应该在特征中添加abstract修饰符。所以我尝试从示例 2 中的 Doubling::put 中删除 abstract 修饰符,就像这样

// case 2
override def put(a: Int) { super.put(a*2) }

但是编译器也会提示

Error:(35, 36) method put in class IntQueue is accessed from super. It may not be abstract unless it is overridden by a member declared `abstract' and `override'
override def put(a: Int) { super.put(a*2) }
^

我知道这里 override 修饰符的原因,但我不知道为什么编译器提示我应该添加 abstract 修饰符。前一种情况下的编译器是否只是提示我应该只将抽象放在类中?

最佳答案

你说“我认为这条消息表明它不应该在特征中添加抽象修饰符。”不,这意味着在 Scala 中,如果具有抽象方法,则将其标记为抽象,但不要在方法本身上使用 abstract 关键字。编译器知道方法是抽象的,只是因为您没有提供实现。

对于第二个问题,您在重写 put 时需要 abstract 关键字的原因是 IntQueue put 是抽象的。您告诉编译器 super.put(a*2) 并不是真正尝试调用抽象方法,这当然是行不通的——您期望混合一个特征,其中提供实现。

更多信息here .

关于scala - 为什么在两种情况下在特征中使用抽象修饰符时编译器会提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230720/

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