1

我想要一种方便的方法来获取一组参数并返回一个数组,就像Arrays.asList(T... items)获取一组参数并返回其中的一个List<T>

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

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

我有几个像下面这样的调用,它们将各种键/值放入 M​​ap:

        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。这是我误解的第一个原因。

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

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

4

5 回答 5

9

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

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

回应您的更新:

正如您发现的那样,参数化类型的数组永远不可能是类型安全的。这是几个限制之一,因为数组和泛型就像油和水

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

首先,我建议您将地图的类型更改为保存Lists 而不是数组:

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);

如果您想在一个语句中全部完成,那么没有可变参数会更加棘手。GuavaImmutableList公开了of工厂方法,它最多占用 12 个元素,然后再使用可变参数。如果List地图中的 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,您可能会考虑使用 aMultimap而不是 a Mapof Lists。

于 2012-07-03T18:52:23.247 回答
1

这样的方法会做什么,而数组的构造函数还没有呢?

String foo = "FOO";
String bar = "BAR";
String[] strings = new String[]{foo, bar};
于 2012-07-03T18:53:18.967 回答
1

怎么样

public static class ToArray {
    public static <T> T[] toArray(T... items) {
        return items;
    }                
}

public void example() {
    String[] strings = ToArray.toArray("fred", "bob");
}

?

于 2012-07-03T18:58:41.253 回答
1

为了得到 aSet并返回 aList你可以使用 a 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[]);
于 2012-07-03T19:00:41.947 回答
1

这是你想要的吗?这将返回一个数组,因为 Java将 varargs 构造视为一个数组。我不知道如何通用化它。

public Object argsToArray(Object... args) {
return args;
}
于 2012-07-03T19:10:08.013 回答