【发布时间】:2020-04-18 22:38:52
【问题描述】:
我有一个看起来像这样的场景:
trait T { }
class A extends T { }
class Container[T](val value: T) { }
val valueFromElsewhere = new Container[A](new A())
val container: Container[T] = valueFromElsewhere
implicit def boilderplate(a: Container[A]): Container[T] = new Container[T](a.value)
我想使用valueFromElsewhere。它在一个容器中,容器的类型参数A按规范具有特征T。我只需要使用T的东西。
但是没有boilerplate,编译器不知道如何将Container[A] 转换为Container[T]。由于除了A 之外还有更多具有T 特征的类,我需要为它们中的每一个编写一个隐式转换。有没有更清洁的方法来做到这一点?
【问题讨论】:
-
您所需要的只是协方差:
class Container[+W](val value: W) { } -
没有协方差(这确实是更好的解决方案)你仍然不需要为
T的每个子类型编写单独的转换:implicit def boilerplate(a: Container[_ <: T]): Container[T] = new Container[T](a.value)