加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读