首页 > 解决方案 > 将 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,编译器不知道如何将 a 转换Container[A]为 a Container[T]。由于除此之外还有更多类A具有 trait T,因此我需要为它们中的每一个编写一个隐式转换。有没有更清洁的方法来做到这一点?

标签: scalatypes

解决方案


正如@jwvh 和@Alexey Romanov 所建议的,您可以使用这两种解决方案。

来自 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)

推荐阅读