gpt4 book ai didi

scala - F-Bounded Polymorphic 类型和非泛型子类型的存在类型?

转载 作者:行者123 更新时间:2023-12-04 21:40:05 25 4
gpt4 key购买 nike

我有两个子类型,我需要通过类型 A 成为 F 有界多态性,以及这些子类型之一的子类型,即

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, c, 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, c, d)
^

为什么我会收到这个错误?当然 CTer 的子类型,而后者又是 A[Ter] 的子类型,因此 CA[Ter] 的子类型,因此存在 TTer使得 CA[T] 的子类型,因此 CSomeA 的子类型.

就好像子类型的传递性不起作用。当我用 c.asInstanceOf[SomeA] 破解它时我的代码编译通过,我的单元测试通过。可能是编译器错误吗?

我还以为 List[A[_]]打字比 List[SomeA] 强,即前者说列表包含 A[T]一些固定式 T ,后者表示列表包含 A[T]哪里 T不固定。

奖金 如果您能解释为什么当前接受的答案有效,即为什么编译器无法确定类型在没有归属的情况下有效。

最佳答案

我猜编译器需要一些帮助。以下应该工作:

val l2 = List[SomeA](b, c: Ter, d)

关于scala - F-Bounded Polymorphic 类型和非泛型子类型的存在类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com