gpt4 book ai didi

scala - 在 scala 中创建元组时类型绑定(bind)错误

转载 作者:行者123 更新时间:2023-12-01 04:30:07 26 4
gpt4 key购买 nike

说我有一个类型

trait Mode[T]
trait MyType[T, M <: Mode[T]]

这编译
val t: MyType[_, _] = ???
t

但不是这个
val t: MyType[_, _] = ???
"some_string" -> t

错误提示类似于 type arguments [_$0,_$1] do not conform to trait MyType's type parameter bounds
所以我的问题是为什么这不能在创建元组时编译?

最佳答案

其实都是t"some string" -> t将在运行时出现同样的问题:

import scala.language.existentials
import scala.reflect.runtime.universe._

type SubMode[T] = M forSome { type M <: Mode[T] }

val t: MyType[_, _] = new MyType[String, SubMode[String]] {}
// t: MyType[_, _] = $anon$1@596afb2f

"some string" -> t
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

reify(t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

reify("some string" -> t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

事实上,编译时的问题并不特定于元组。例如:
List(t)
// error: type arguments [_$1,_$2] do not conform to trait MyType's type parameter bounds [T,M <: Mode[T]]

我的猜测是,虽然 t 的定义单独不会触发编译错误,在 t 上的额外“触摸”可能。如果您让编译器推断出正确的类型,一切都会正常工作:
val t2 = new MyType[String, SubMode[String]] {}
t2: MyType[String,SubMode[String]] = $anon$1@19d53ab4

"some string" -> t2
// res1: (String, MyType[String,SubMode[String]]) = (some string,$anon$1@19d53ab4)

List(t2)
// res2: List[MyType[String,SubMode[String]]] = List($anon$1@19d53ab4)

关于scala - 在 scala 中创建元组时类型绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54890617/

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