【发布时间】:2020-09-13 20:14:39
【问题描述】:
假设我有
public enum MyEnum {
..
}
当我调用时
java.util.Arrays.asList(MyEnum.values)
我回来了
java.util.List[Array[MyEnum]]
而不是
java.util.List[MyEnum]
这是为什么呢?
我是否缺少一些 JavaConverter 魔法?
【问题讨论】:
标签: scala
假设我有
public enum MyEnum {
..
}
当我调用时
java.util.Arrays.asList(MyEnum.values)
我回来了
java.util.List[Array[MyEnum]]
而不是
java.util.List[MyEnum]
这是为什么呢?
我是否缺少一些 JavaConverter 魔法?
【问题讨论】:
标签: scala
java方法的签名是
static <T> List<T> asList(T... a)
,即它需要可变数量的参数。您正在传递一个数组,因此您将获得一个包含单个数组的列表。
如果您想将数组的每个元素作为单独的参数传递,请使用_*-annotation:
java.util.Arrays.asList(java.util.concurrent.TimeUnit.values: _*)
如果您想要一个 Scala List,请直接在数组上使用 toList:
java.util.concurrent.TimeUnit.values.toList
【讨论】:
感谢 Andrey Tyukin 已经指出正确答案。
为了完整性,我只是复制粘贴 Ascription 的 scala 文档
归属
类型归属经常与类型注释混淆,因为 Scala 中的语法是相同的。以下是示例 归属:
- 无:列表[字符串]
- 设置(值:_*)
- “丹尼尔”:AnyRef
Ascription 基本上只是在编译时执行的向上转换 为了类型检查器。它的使用并不常见,但确实如此 偶尔发生。 最常见的归因案例是 使用单个 Seq 参数调用 varargs 方法。这个完成了 通过赋予 _* 类型(如上面的第二个示例)。
Ascription 遵循类型注释约定;后跟一个空格 冒号
【讨论】:
List(1, 2, 3): _* 这样的东西本身似乎不是一个有效的表达式,而"foo": AnyRef 肯定是。编译器中的错误消息将_*-gizmo 称为“注释”。 _* 似乎更像是支持 java 风格可变参数的特例。
: Seq[??],所以我想这就是为什么它被称为@AndreyTyukin。也是同样的语法。