我有一个看起来像这样的场景:
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)