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

Lui*_*hys 4 types scala type-parameter

我正在拼凑这个问题的答案:Scala mixin到类实例,在那里我展示了一种"混入"另一个特征或类实例到现有实例的方法:

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
Run Code Online (Sandbox Code Playgroud)

所以经过局部隐式def后​​,dave可以有效地用作一个Person with Dog.我的问题是,如果我们想要定义一个Person仅在Person具有a 的情况下获取实例的方法,Dog我们该怎么做?

我可以定义一个方法,如

def showDog(pd: Person with Dog) = pd.name + " shows " + pd.dogName
Run Code Online (Sandbox Code Playgroud)

然而这并不好,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]) = ...
Run Code Online (Sandbox Code Playgroud)

但这是不合法的error: illegal dependent method type.有任何想法吗?

Des*_*tin 5

如果您使用-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
Run Code Online (Sandbox Code Playgroud)