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

泛型 – 如何使用未在第一个参数列表中显示的类型参数来改进Scal

发布时间:2020-12-16 18:51:42 所属栏目:安全 来源:网络整理
导读:为了说明我的观点,这里有一个例子: abstract class Wrapper[A](wrapped: A) { protected def someCondition: Boolean def fold[B](whenTrue: = B)(whenFalse: = B): B = if (someCondition) whenTrue else whenFalse} 我正在尝试添加基于在包装类型A上定义
为了说明我的观点,这里有一个例子:

abstract class Wrapper[A](wrapped: A) {

  protected def someCondition: Boolean

  def fold[B](whenTrue: => B)(whenFalse: => B): B =
    if (someCondition) whenTrue else whenFalse

}

我正在尝试添加基于在包装类型A上定义的任意条件的折叠方法.上面的代码的问题是这不会编译,尽管它可以想象地返回Any:

wrapper.fold("hi")(42)

因为在编译器到达第二个参数列表时,B已被推断为String.假设我们不想编写类型注释.我们可以尝试将折叠更改为:

def fold[B,B0 >: B](whenTrue: => B)(whenFalse: => B0): B0

但这也行不通,因为B0已经在第一个参数列表的末尾被解析为String,尽管它根本没有出现在它中!当然,简单的解决方案是使用单个参数列表,但是为了示例,假设我想保留两个参数列表并尝试使其工作…理想情况下,我们应该能够延迟分辨率B0.如果我们能写出这样的东西会很棒:

def fold[B](whenTrue: => B)[B0 >: B](whenFalse: => B0): B0

但不幸的是,这不起作用.有没有解决方法?

(我提供了第一个答案,但我当然也在寻找其他解决方法.)

解决方法

由于编译,您似乎想要模仿Either类的行为和目标.
你可以做的是:你的折叠将返回一个Either对象并从中获取你的B0值:

abstract class Wrapper[A](wrapped: A) {

  protected def someCondition: Boolean

  def fold[A,B](whenTrue: => B)(whenFalse: => A): Either[A,B] =
    Either.cond(someCondition,whenTrue,whenFalse)

}

并且让Eitherclass的可隐式转换成为可行的:

scala> new Wrapper[Unit] {def someCondition = true}
res0: Wrapper[Unit] = $anon$1@77026e40

scala> res0.fold(42)("hi").merge
res1: Any = 42

优点:

> Either结构允许您直接检索A和B类型
>您可以检查折叠期间应用了哪些部件

缺点:

>您没有直接获得结果

(编辑:李大同)

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

    推荐文章
      热点阅读