arrays - 了解多维数组创建期间的参数类型
问题描述
我正在尝试解析type _1 >: Char with Int <: AnyVal
在以下代码中创建的参数类型的含义(使用 Scala ammonite repl)。我正在定义一个数组数组
with
在这种情况下,我们是否使用 Int 的“特征”定义了一个新的 Char 类是什么意思?- 表达式是否
>: Char with Int <: AnyVal
意味着 - 作为具有 Int 的 Char 的超类型但是 AnyVal 的子类型的任何类型 (_1)?
@ val tmix1 = Array(Array[Int](1,2,3), Array[Char]('b','f'))
tmix1: Array[Array[_1] forSome { type _1 >: Char with Int <: AnyVal }]
= Array(Array(1, 2, 3), Array('b', 'f'))
解决方案
表达式 >: Char with Int <: AnyVal 是否意味着 - 任何类型 (_1) 是 Char with Int 的超类型但 AnyVal 的子类型?
是的,这是正确的。
我们是否使用 Int 的“特征”定义了一个新的 Char 类
我们没有定义任何东西。你在写 'x: Int => String' 时定义了一个 'class' 吗?不,它只是类型表达式。这是一种允许您表达类型的语法。使用关键字“with”,您可以构造一个类型,它是 Char 的子类型和 Int 的子类型。此表达式可用作联合类型编码 ( https://stackoverflow.com/a/6883076/14044371 )。联合类型是一种在单个类型中将几个类型与逻辑“或”组合在一起的类型。它也称为“类型析取”。直观地,您可以通过想象示例来尝试理解这一点:
// what is the possible supertypes for type 'Char with Int'?
// it is 'Char with Int', Int, Char, AnyVal, Any
val x: Char with Int = Char with Int
val a: Int = Char with Int
val b: Char = Char with Int
val c: AnyVal = Char with Int
val d: An y= Char with Int
所以T >: Char with Int
几乎T <: AnyVal
等同于Char Or Int
对于直觉,Char Or Int
我可以给你这个:
val a: Char Or Int = 1 // is it correct? yes it is
val b: Char Or Int = 'a' // it is correct too
// after that, you can pattern match on such type in a safe manner
def foo(x: Char Or Int) match {
case Int => ...
case Char => ...
}
所以。
你的第二个问题是正确的。
一开始你不太对,因为它不是“类”或“特征”——它是类型表达式。这不直观,因为您在类和特征的继承中具有相同的单词“with”。但是这个词在不同的上下文中意味着一些不同的东西。
这种结构是表达联合类型的方式,它非常适合原始表达式的类型val tmix1 = Array(Array[Int](1,2,3), Array[Char]('b','f'))
推荐阅读
- flutter - 无法在构建小部件下的颤动中添加 2 个按钮
- reactjs - Expo字体加载不正确
- javascript - WooCommerce:将类添加到活动支付方式并保留它
- angular - 无法匹配任何路线 - Ionic 5 Angular 项目
- visualization - dc.js - 如何动态修改热图中的单元格大小?
- java - Agora Android 示例应用在启动时崩溃
- testing - 如何修复量角器、log4js 配置错误?
- python - 在将 PIL 图像转换为张量时,为什么像素会发生变化?
- android - 折叠工具栏展开时如何显示布局
- sql - 子查询和连接没有给出相同的结果