【发布时间】:2021-09-21 12:44:44
【问题描述】:
我有
trait MyBase[T <: MyBase[T]] {
def myid: String
}
这么写
case class MyBaseContainer(myBase: MyBase[_])
在MyBase 中为T 产生类型绑定错误
type arguments [_$1] do not conform to trait MyBase's type parameter bounds [T <: Playground.MyBase[T]]
写成
case class MyBaseContainer[T <: MyBase[_]](myBase: T)
编译所有错误。
为什么会这样? MyBaseContainer 的这两个签名在语义上不是等效的吗?
是否有一种语法方法可以将类型参数MyBase 约束到所需的界限,而不将T 作为类型参数传递给MyBaseContainer?
【问题讨论】:
-
错误消息似乎可以解释问题:
_不受限制,但MyBase的类型参数需要限制T <: MyBase[T]或更严格。 -
@Tim 除了将
T作为类型参数传递给MyBaseContainer之外,还有另一种语法方式来约束它吗? -
我不这么认为,但不是专家
-
@James 你可以写
case class MyBaseContainer(myBase: MyBase[T] forSome {type T <: MyBase[T]})
标签: scala generics type-conversion existential-type f-bounded-polymorphism