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

emm*_*mby 1 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)});
Run Code Online (Sandbox Code Playgroud)

...地图的类型 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)));
Run Code Online (Sandbox Code Playgroud)

......在哪里toArray()被定义为类似的东西

private static <T> T[] toArray( T... t ) {
    return t;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pau*_*ora 9

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

String[] strArray = {"one", "two", "three"};
Run Code Online (Sandbox Code Playgroud)

为了回应您的更新:

正如您所发现的那样,参数化类型的数组永远不会是类型安全的.由于阵列和仿制药就像油和水一样,这是几个局限之一.

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

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

Map<Key<? extends Foo>, List<Key<? extends Foo>>> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

然后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);
Run Code Online (Sandbox Code Playgroud)

如果你想在一个声明中使用它,那么没有varargs就会变得更加棘手.Guava ImmutableList公开了of工厂方法,最多需要12个元素才能回归到varargs.如果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))
);
Run Code Online (Sandbox Code Playgroud)

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

map.put(
    Key.get(A.class),
    Lists.newArrayList(ImmutableList.of(
        Key.get(X.class),
        Key.get(Y.class),
        Key.get(Z.class)
    ))
);
Run Code Online (Sandbox Code Playgroud)

但是那时你只是为了风格而引入开销.


附注:如果你碰巧使用番石榴,你可能看使用Multimap的,而不是一个MapList秒.