scala - 我们可以使用单例 .type 作为类型参数吗?

标签 scala types type-parameter

我拼凑了这个问题的答案: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

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

我可以定义一个方法,例如
def showDog(pd: Person with Dog) = pd.name + " shows " + pd.dogName

然而这对dave没有好处因为他还只是一个Person ,尽管他有隐性的变身能力。

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

但这不合法,给 error: illegal dependent method 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

关于scala - 我们可以使用单例 .type 作为类型参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200203/

相关文章:

postgresql - 如何在 PostgreSQL (9.1) 函数中将字符转换为整数?

Python随机改变数据类型

Scala将类型参数传递给对象

scala - scala 中的字符串连接是否与 Java 中一样 coSTLy?

scala - 传递和使用隐式函数而不定义它

c# - 始终使用自定义数据类型

java - 如何获取泛型函数体内的实际类型?

c# - 使用泛型接口(interface)作为方法或函数的类型参数

scala - "too generic"类型系统是什么意思?

Scala:如何忽略 'SSLHandshakeException'