相当于Arrays.asList()但是对于数组?

时间:2012-07-03 18:50:10

标签: java

我想要一个方便的方法来获取一组参数并返回一个数组,就像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()会使这个陈述比实际更简洁,因此我正在寻找一些对我来说也是如此的数组。

所以我认为问题确实存在 - 在上述情况下是否有简洁的方法来获得类型安全?

5 个答案:

答案 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)

这是你想要的吗?这将返回一个数组,因为Java treats the varargs construct as an array。我不知道如何对它进行泛化。

public Object argsToArray(Object... args) {
return args;
}