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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |