scala - 将 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
,因此我需要为它们中的每一个编写一个隐式转换。有没有更清洁的方法来做到这一点?
解决方案
正如@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)
推荐阅读
- sql - SQL Count first occurrence
- azure - 为 Azure Active Directory 用户创建 SQL 登录
- asp.net-mvc - Kendo MVC 网格,隐藏 .Filterable
- java - SonarQube 分析显示代码覆盖率 0
- sql - 使用 case 表达式将数据插入表中
- java - 如何以及在何处分配参考 ID?
- reactjs - 如何替换 immutableJs 中的集合
- git - 不支持从 SVN 迁移到 GIT 请求的身份验证类型
- python - 如何在 Python 中检查 n 个列表并将其转换为 pandas 数据框?
- unity3d - 如何在 Unity 中的兼容组件上使用 HoloLens 2 手部跟踪和近交互输入(Near Interaction Grabbable、Manipulation Handler)