加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么类不能用相同签名的方法扩展traits?

发布时间:2020-12-16 09:47:31 所属栏目:安全 来源:网络整理
导读:为什么会出现以下错误?如何解决它? 编辑:我假设,因为A和B编译为(接口,类)对,这是一个问题选择正确的静态方法调用实现时编译C.我期望的优先级是根据顺序。 scala trait A {def hi = println("A")}defined trait Ascala trait B {def hi = println("B")}
为什么会出现以下错误?如何解决它?

编辑:我假设,因为A和B编译为(接口,类)对,这是一个问题选择正确的静态方法调用实现时编译C.我期望的优先级是根据顺序。

scala> trait A {def hi = println("A")}
defined trait A

scala> trait B {def hi = println("B")}
defined trait B

scala> class C extends B with A
:6: error: error overriding method hi in trait B of type => Unit;
 method hi in trait A of type => Unit needs `override' modifier
       class C extends B with A

scala> trait A {override def hi = println("A")}
:4: error: method hi overrides nothing
       trait A {override def hi = println("A")}

编辑:注意,在Ruby这工作很好:

>> module B; def hi; puts 'B'; end; end
=> nil
>> module A; def hi; puts 'A'; end; end
=> nil
>> class C; include A; include B; end
=> C
>> c = C.new
=> #
>> c.hi
B
=> nil

解决方法

这对我来说在2.8和2.11,并将允许你是非侵入性的A或B:

trait A { def hi = println("A") }
trait B { def hi = println("B") }

class C extends A with B {
  override def hi = super[B].hi
  def howdy = super[A].hi // if you still want A#hi available
}

object App extends Application {
  (new C).hi // prints "B"
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读