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

scala – 我们可以使用singleton .type作为类型参数吗?

发布时间:2020-12-16 10:03:19 所属栏目:安全 来源:网络整理
导读:我正在拼凑这个问题的答案: Scala mixin to class instance,在那里我展示了一种“混入”另一个特征或类实例到现有实例的方法: case class Person(name: String)val dave = Person("Dave")val joe = Person("Joe")trait Dog { val dogName: String }val spo
我正在拼凑这个问题的答案: Scala mixin to class instance,在那里我展示了一种“混入”另一个特征或类实例到现有实例的方法:

case class Person(name: String)
val dave = Person("Dave")
val joe  = Person("Joe")

trait Dog { val dogName: String }
val spot = new Dog { val dogName = "Spot" }

implicit def daveHasDog(p: dave.type) = spot

dave.dogName //"Spot"
joe.dogName  //error: value dogName is not a member of Person

所以在本地隐式def之后,dave可以有效地用作Dog with Person.我的问题是,如果我们想要定义一个仅在Person有狗的情况下接受Person实例的方法,我们该怎么做呢?

我可以定义一个方法,如

def showDog(pd: Person with Dog) = pd.name + " shows " + pd.dogName

然而这对dave来说并不好,因为他仍然只是一个人,尽管他有隐含的转换能力.

我尝试过定义

trait Dog [T] { val dogName: String }
val spot = new Dog [dave.type] { val dogName = "Spot" }
def showDog(p: Person)(implicit dog: Dog[p.type]) = ...

但这不合法,给出错误:非法依赖方法类型.有任何想法吗?

解决方法

如果使用-Ydependent-method-types进行编译,则原始代码将使用showDog的此定义:

scala> def showDog(p: Person)(implicit ev: p.type => Dog) = p.name + " shows " + p.dogName
showDog: (p: Person)(implicit ev: p.type => Dog)java.lang.String

scala> showDog(dave)
res1: java.lang.String = Dave shows Spot

(编辑:李大同)

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

    推荐文章
      热点阅读