【问题标题】:Arrays.asList(MyEnum.values) returning List[Array[T]] instead of List[T]Arrays.asList(MyEnum.values) 返回 List[Array[T]] 而不是 List[T]
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢 Andrey Tyukin 已经指出正确答案。

    为了完整性,我只是复制粘贴 Ascription 的 scala 文档

    归属

    类型归属经常与类型注释混淆,因为 Scala 中的语法是相同的。以下是示例 归属:

    • 无:列表[字符串]
    • 设置(值:_*)
    • “丹尼尔”:AnyRef

    Ascription 基本上只是在编译时执行的向上转换 为了类型检查器。它的使用并不常见,但确实如此 偶尔发生。 最常见的归因案例是 使用单个 Seq 参数调用 varargs 方法。这个完成了 通过赋予 _* 类型(如上面的第二个示例)。

    Ascription 遵循类型注释约定;后跟一个空格 冒号

    【讨论】:

    • 嗯,很有趣。我不确定为什么在文档中将其称为“类型归属”。像List(1, 2, 3): _* 这样的东西本身似乎不是一个有效的表达式,而"foo": AnyRef 肯定是。编译器中的错误消息将_*-gizmo 称为“注释”。 _* 似乎更像是支持 java 风格可变参数的特例。
    • 这有点像: Seq[??],所以我想这就是为什么它被称为@AndreyTyukin。也是同样的语法。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多