scala - Scala存在类型奇怪的行为
问题描述
我的 REPL 中有以下内容:
scala> trait T[A]
defined trait T
scala> :kind T[A] forSome {type A}
T[_]'s kind is A
scala> :kind T[_]
T[_]'s kind is A
现在当我这样做时:
trait e[_] extends T[_]
我明白了
error: class type required but T[_] found
但是,以下工作:
scala> trait e[_] extends T[Int]
defined trait e
和
scala> :kind T[Int]
T[Int]'s kind is A
为什么 T[Int] 与 T[_] 的处理方式不同,而它们属于同一种类?
解决方案
这不是关于种类,而是关于类型是否是类类型(包括特征)。
你可以写
type T <: U
对于每种类型U
,但
trait T extends U
仅适用于类类型 U
。
子类型化和继承/子类化是不同的。
a 对应的trait T[A]
类型是每个类型的类类型A
。T[Int]
类类型也是如此。(当你写extends A[B]
重要的A
是类类型时,B
可以是任意类型。)
存在类型(如T[_]
aka T[A] forSome {type A}
)不是类类型。(您也可以将其T[_]
视为 all 的超类型T[A]
。实际上,T[_]
是所有 的最小上限T[A]
)。
推荐阅读
- css - 如何在 css 类中与其他元素分开选择一堆元素?
- c# - Moq + Autofixture:对依赖属性使用设置会清除整个模拟对象
- javascript - 不使用边框的圆形边框-?
- python - 如何从一个简单的数学方程的结果中创建一个列表?
- pandas - 用 .loc 替换值
- c# - 如何在 LINQ to SQL 中编写右侧为空的 LEFT OUTER JOIN?
- snowflake-cloud-data-platform - 雪花:过滤包含正确日期值的行
- mysql - Mysql外键约束删除
- ruby - 无法在 ruby 1.9.3 Alpine 上安装 ffi gem
- php - 您可以让 mailchimp 使用除订阅之外的其他词吗?