scala – F-Bounded多态类型和非泛型子类型的存在类型?
发布时间:2020-12-16 18:31:03 所属栏目:安全 来源:网络整理
导读:我有两个子类型,我需要通过类型A进行F-bounded多态,以及其中一个子类型的子类型,即 trait A[T : A[T]] { def x: T}trait Ter extends A[Ter]trait For extends A[For]trait C extends Ter 接下来我尝试实现一个具体类型 case class F2(l: List[A[_]]) extend
我有两个子类型,我需要通过类型A进行F-bounded多态,以及其中一个子类型的子类型,即
trait A[T <: A[T]] { def x: T } trait Ter extends A[Ter] trait For extends A[For] trait C extends Ter 接下来我尝试实现一个具体类型 case class F2(l: List[A[_]]) extends For { def x: For = F2(l.map(_.x)) } 但这无法编译: <console>:11: error: type mismatch; found : List[Any] required: List[A[_]] def x: For = F2(l.map(_.x)) ^ 所以,谷歌说我需要使用存在类型,这是有道理的,所以我尝试: import scala.language.existentials type SomeA = T forSome { type T <: A[T] } case class F1(l: List[SomeA]) extends For { def x: For = F1(l.map(_.x)) } 但是,当我尝试实例化时,现在我遇到了一个新问题 trait Example { val b: Ter val c: C val d: For // Works fine val l1: List[A[_]] = List(b,c,d) // But this doesn't work,fails to compile (see below) val l2: List[SomeA] = List(b,d) val f1 = F1(l2) } 编译错误: <console>:22: error: type mismatch; found : C required: SomeA (which expands to) T forSome { type T <: A[T] } val l2: List[SomeA] = List(b,d) ^ 为什么我会收到此错误?当然C是Ter的子类型,它又是A [Ter]的子类型,因此C是A [Ter]的子类型,因此存在T即Ter,使得C是A [T]的子类型,因此C是SomeA的子类型. 就好像子类型的传递性不起作用.当我用c.asInstanceOf [SomeA]破解它时,我的代码编译并且我的单元测试通过了.它可能是编译器错误吗? 我还认为List [A [_]]比List [SomeA]更强的输入,即前者说该列表由A [T]组成一些固定类型T,后者表示该列表由A [T组成]其中T不固定. BOUNS如果您可以解释为什么当前接受的答案有效,即为什么编译器无法确定该类型在没有归属的情况下有效. 解决方法
我想编译器需要一些帮助.以下应该有效:
val l2 = List[SomeA](b,c: Ter,d) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – Angular – 看不到如何隐藏此API密钥
- 在angular cli项目结构中添加或放置外部Javascript文件的位
- Scala 方法与函数简单记录
- 使用回调和线程处理一个耗时响应过程
- 在Play Scala中使用Iteratees和Enumerators将数据流式传输到
- 详解Docker方式实现MySql 主从复制(实践篇)
- Angular4.x学习之路分享【1】--项目的框架搭建
- Azure 基础:使用 powershell 创建虚拟网络
- angularjs – 点击ng-click的复选框不会更新模型
- scala – 如何在不升级到Akka HTTP的情况下停止使用路由DSL