gpt4 book ai didi

scala - 从父类(super class)型解析隐式参数

转载 作者:行者123 更新时间:2023-12-01 10:32:39 24 4
gpt4 key购买 nike

如果为其父类(super class)型 A 定义了隐式参数,是否可以解析类型 B 的隐式参数?

这是一个例子:

我有一个可枚举类型类:

trait Enumerable[A] {

def name(a: A): String

def list: List[A]

//... other methods
}

object Enumeration {
def name[A, T >: A](a: A)(implicit ev: Enumerable[T]) = ev.name(a)

def list[T](implicit ev: Enumerable[T]) = ev.list

// ...
}

然后我定义一个可枚举的实例:

sealed trait Season

case object Winter extends Season
case object Spring extends Season
case object Summer extends Season
case object Fall extends Season

implicit val seasonEnumerable = new Enumerable[Season] {
override def list: List[Season] = List(Winter, Spring, Summer, Fall)
}

// working :
Enumeration.name(Winter: Season) shouldBe "winter"

// faling :
Enumeration.name(Winter) shouldBe "winter"

如果我不告诉 scalac 冬天是一个季节,Enumeration.name(Winter) 就会失败。我已经指定“名称”方法签名中的隐式参数是 A 的父类(super class)型,但这还不够……

有更好的方法吗?

最佳答案

Eduardo 的回答解释了为什么带有 [A, T >: A] 的版本不起作用。但是这个问题有一个比他给出的更简单的解决方案:不是引入 T infer 作为类型参数,而是通过存在类型引入它:

def name[A](a: A)(implicit ev: Enumerable[T >: A] forSome { type T }) = ev.name(a)

或者,使用速记,

def name[A](a: A)(implicit ev: Enumerable[_ >: A]) = ev.name(a)

然后编译器只需要在寻找ev时决定T是什么。

关于scala - 从父类(super class)型解析隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40840308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com