无沸腾板的方式将 Scala 类型参数向上转换为更一般的特征



我有一个看起来像这样的场景:

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,我需要为每个类编写一个隐式转换。有没有更清洁的方法可以做到这一点?

正如@jwvh和@Alexey罗曼诺夫所建议的那样,您可以使用这两种解决方案。

从 jwvh

trait T
class A extends T
class Container[+W](val value: W)
val valueFromElsewhere = new Container[A](new A())
val container: Container[T] = valueFromElsewhere
//container: Container[T] = Container@69ba0e9

从 阿列克谢

trait T {}
case class A(a: Int) extends T {}
case class B(b: Int) extends T {}
class Container[T](val value: T) {}

object application extends App {
implicit def boilderplate(a: Container[_ <: T]): Container[T] = new Container[T](a.value)
val valueFromElsewhere = new Container[A](A(1))
val valueFromElseWhere2 = new Container[B](B(2))
val container: Container[T] = valueFromElsewhere
val container1: Container[T] = valueFromElseWhere2
}
println(container.value)
println(container1.value)

最新更新