我想要一个方便的方法来获取一组参数并返回一个数组,很像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
而不是 Map
的 List
关于java - 等同于 Arrays.asList() 但对于数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317266/