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

多态Scala返回类型

发布时间:2020-12-16 09:02:28 所属栏目:安全 来源:网络整理
导读:我有一个抽象的 Scala类Base,它有Derived1和Derived2的子类. Base定义了一个函数f(),它返回与其实现类相同类型的对象.因此Derived1.f()返回Derived1,Derived2.f()返回Derived2.我如何在Scala中写这个? 这是我到目前为止所提出的. package com.github.wpm.ca
我有一个抽象的 Scala类Base,它有Derived1和Derived2的子类. Base定义了一个函数f(),它返回与其实现类相同类型的对象.因此Derived1.f()返回Derived1,Derived2.f()返回Derived2.我如何在Scala中写这个?

这是我到目前为止所提出的.

package com.github.wpm.cancan

abstract class Base {
  def f[C <: Base]: C
}

case class Derived1(x: Int) extends Base {
  def f[Derived1] = Derived1(x + 1)
}

case class Derived2(x: Int) extends Base {
  def f[Derived2] = Derived2(x + 2)
}

这给出了以下编译器错误:

type mismatch;
[error]  found   : com.github.wpm.cancan.Derived1
[error]  required: Derived1
[error]   def f[Derived1] = Derived1(x + 1)

type mismatch;
[error]  found   : com.github.wpm.cancan.Derived2
[error]  required: Derived2
[error]   def f[Derived2] = Derived2(x + 2)

此错误消息让我感到困惑,因为我认为com.github.wpm.cancan.Derived1应该与此上下文中的Derived1相同.

解决方法

Randall Schulz指出了当前代码不起作用的原因之一.但是,使用 F-bounded polymorphism可以得到你想要的东西:

trait Base[C <: Base[C]] { def f: C }

case class Derived1(x: Int) extends Base[Derived1] {
  def f: Derived1 = Derived1(x + 1)
}

case class Derived2(x: Int) extends Base[Derived2] {
  // Note that you don't have to provide the return type here.
  def f = Derived2(x + 2)
}

基本特征上的类型参数允许您在那里讨论实现类 – 例如.在f的返回类型中.

(编辑:李大同)

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

    推荐文章
      热点阅读