我想要一个方便的方法来获取一组参数并返回一个数组,就像Arrays.asList(T... items)
一样,它将获取一组参数并返回这些项目的List<T>
。
编写一个很容易,但是java中已经存在一个吗?
更新 我的错!我没有意识到这个问题是如此不清楚。你的问题迫使我意识到问题不是我认为的问题。
我有几个调用,如下所示,将各种键/值放入Map:
put( Key.get(A.class), new Key[] { Key.get(X.class), Key.get(Y.class), Key.get(Z.class)});
...地图的类型为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
手动创建新数组更简洁。这是我误解的第一个原因。
我认为我可以通过使用List而不是数组然后使用Arrays.asList()
来填充列表的值来获得类型安全,但事实证明这也不是类型安全的。这是我误解的第二个原因。我认为Arrays.asList()
会使这个陈述比实际更简洁,因此我正在寻找一些对我来说也是如此的数组。
所以我认为问题确实存在 - 在上述情况下是否有简洁的方法来获得类型安全?
答案 0 :(得分:9)
数组已经有了这样的快捷语法:
String[] strArray = {"one", "two", "three"};
响应您的更新:
您似乎发现,参数化类型的数组永远不能是类型安全的。由于arrays and generics are like oil and water。
这一事实,这是一些限制因素诸如Arrays.asList
之类的varargs方法不能避免此限制,因为varargs通过隐式创建逗号分隔参数的数组来工作。为了具有类型安全性,您需要避免任何涉及数组的解决方案,包括varargs。
首先,我建议您更改地图的类型以保留List
而不是数组:
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);
:
of
如果你想在一个声明中全部使用它,那么没有varargs就会变得更加棘手。 Guava的ImmutableList
暴露了List
工厂方法,最多需要12个元素,然后再回到varargs。如果地图中的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)
))
);
来修改,您仍然可以利用这些工厂方法:
Map
然而,你只是为了风格而引入开销。
附注:如果你碰巧使用的是Guava,你可能会考虑使用Multimap
而不是List
{{1}}。
答案 1 :(得分:1)
这样的方法会做什么,数组的构造函数还没有?
String foo = "FOO";
String bar = "BAR";
String[] strings = new String[]{foo, bar};
答案 2 :(得分:1)
怎么样
public static class ToArray {
public static <T> T[] toArray(T... items) {
return items;
}
}
public void example() {
String[] strings = ToArray.toArray("fred", "bob");
}
答案 3 :(得分:1)
要获得Set
并返回List
,您可以使用ArrayList
:
Set<String> set = new HashSet<String>();
set.add("str1");
set.add("str2");
set.add("str3");
List<String> list = new ArrayList<String>(set);
如果你想要一个列表中的数组,你可以这样做:
myList.toArray();
// or even
String[] myStringArray = myList.toArray(new String[]);
答案 4 :(得分:1)
public Object argsToArray(Object... args) {
return args;
}