java - 等同于 Arrays.asList() 但对于数组?

标签 java

我想要一个方便的方法来获取一组参数并返回一个数组,很像Arrays.asList(T... items)将采用一组参数并返回 List<T>这些项目。

写一个很容易,但是 java 中已经存在吗?

更新 我的错!我没有意识到这个问题如此不清楚。你的问题迫使我意识到这个问题并不完全是我想的那样。

我有几个像下面这样的调用将各种键/值放入映射中:

        put( Key.get(A.class), new Key[] { Key.get(X.class), Key.get(Y.class), Key.get(Z.class)});

... 其中 map 类型为 Map<Key<? extends Foo>,Key<? extends Foo>[]>

我一直在寻找一种类型安全且简洁的方式来执行上述语句,并且我认为像下面这样的东西会起作用:

        put( Key.get(A.class), toArray( Key.get(X.class), Key.get(Y.class), Key.get(Z.class)));

... 其中 toArray()被定义为类似

private static <T> T[] toArray( T... t ) {
    return t;
}

然而,事实证明这个解决方案本身并不是类型安全的,因此它实际上并不比使用 new 手动创建一个新数组更简洁。 .这是我误解的第一个原因。

我认为我可以通过使用列表而不是数组然后使用 Arrays.asList() 来获得类型安全。填充列表的值,但事实证明这也不是类型安全的。这是造成我误解的第二个原因。我以为Arrays.asList()会使这个陈述比实际更简洁,因此我正在寻找对我来说对数组有同样作用的东西。

所以我想问题真的是 -在上述情况下是否有一种简洁的方法来获得类型安全?

最佳答案

数组已经有了这样的快捷语法:

String[] strArray = {"one", "two", "three"};

响应您的更新:

您似乎发现了,参数化类型的数组永远不可能是类型安全的。这是几个限制之一,因为 arrays and generics are like oil and water .

可变参数方法,例如 Arrays.asList也不能免于此限制,因为可变参数通过隐式创建逗号分隔参数的数组来工作。为了具有类型安全性,您需要避免任何涉及数组的解决方案,包括可变参数。

首先,我建议您将 map 类型更改为 hold List s 而不是数组:

Map<Key<? extends Foo>, List<Key<? extends Foo>>> map = new HashMap<>();

然后构建一个List在将其放入 Map 之前:

List<Key<? extends Foo>> lst = new ArrayList<>();
lst.add(Key.get(X.class));
lst.add(Key.get(Y.class));
lst.add(Key.get(Z.class));
map.put(Key.get(A.class), lst);

如果您希望在一个语句中包含所有内容,那么如果没有可变参数,将会更加棘手。 Guava 的 ImmutableList 公开了 of在回退到可变参数之前,工厂方法最多需要 12 个元素。如果List map 中的 s 稍后不会被修改,您可以存储 ImmutableList<Key<? extends Foo>>并使用:

map.put(
    Key.get(A.class),
    ImmutableList.of(Key.get(X.class), Key.get(Y.class), Key.get(Z.class))
);

事实上,您仍然可以利用这些工厂方法,即使 List需要通过复制返回的 ImmutableList 进行修改:

map.put(
    Key.get(A.class),
    Lists.newArrayList(ImmutableList.of(
        Key.get(X.class),
        Key.get(Y.class),
        Key.get(Z.class)
    ))
);

但是您只是为了风格而引入开销。


旁注:如果您碰巧在使用 Guava,您可能会考虑使用 Multimap 而不是 MapList

关于java - 等同于 Arrays.asList() 但对于数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317266/

相关文章:

java - Hadoop java.lang.RuntimeException : java. lang.NoSuchMethodException

java - Play-java 2.5.9 form.errorsAsJson() 总是返回英文错误信息

java - 将脚本从 python 翻译为 java 时出现问题

java - 如何在 IntelliJ IDEA 11 中添加 Java EE SDK 库

java - 如何在多线程环境中生成PreparedStatement?

java - 使用 jigsaw 模块通过 jdk9 运行 spring boot

java - Spring Boot 自定义 Bean 加载器

java - ASM jar - 为什么我的 java 项目依赖于此?

java - 视频持续时间设置不正确 (exoplayer2)

java - 如何检测 Postgres 临时表是否已经存在?