2016-04-29 16 views
-1

我的问题很简单。标准Java可变参数转换器阵列

是否有核心的Java,做下面的代码的方法:

<T> T[] asArray(T... values) { 
    return values; 
} 

我试着在阵列类寻找它,但似乎没有这样的方法。

为了给你一个背景:

谁在这个代码工作以前的人决定,可变参数比类构造规则排列的更好(即使它应该是一个数组)。现在我得再添通用阵列作为这样的构造转化这段代码的最后一个参数:

public Clazz(String... values) { 
} 

这个

public <T> Clazz(String[] values, T[] additionalParameters) 

因此,我需要重构所有的地方,此构造用过的。更糟糕的是,还有一些其他课程遵循相同的模式,我需要在将来某个时候修改它们。这就是上面提到的方法asArray可以提供帮助。我知道最好在每次出现时用显式的数组创建替换可变参数(这是我将要做的任何事情),但我仍然想知道是否有这样的方法(仅仅是出于仅仅好奇)。

+0

在Java 8+ ,你可以做'return(T [])Stream.of(values).toArray();'和在早期版本中'返回Arrays.asList(values).toArray(values);'。 –

+1

请注意,通用数组类型(如'T []')具有[受限支持](http://stackoverflow.com/q/529085/113632),并且是常见的错误来源。您应该使用'List '来代替。 – dimo414

+0

那么,你也可以创建一个与'T ...'值相等的数组。 'T [] tArray = values;' – Jaims

回答

-2

你可以这样做:

T[] a = Stream.of(t1, t2, t3).toArray(); 
+0

是的,这是一个有趣的解决方案。我不知道我为什么没有自己想想。 :) – DeGriz

+1

这首先构造一个数组(来自可变参数),它被传递到一个新的'ArraySpliterator'中,然后传递给一个新的'Stream',然后分配第二个数组(在'.toArray()'中) ,然后通过至少一个额外的线性'copyInto()'将它在线性时间内从原始数组复制到一个新的'Node'中,最后返回一个数组。多个阵列副本和众多对象分配,为了什么好处? – dimo414

+0

@ dimo414在可变参数上?如果它包含超过10个元素,我会感到惊讶!写干净的代码,而不是考虑10个元素的数组分配。 –

4

的JDK并不需要提供这样的方法,因为您只需构建一个阵列获得相同的行为 - 例如:

// these two statements are conceptually identical 
String[] a = asArray("a", "b", "c"); 
String[] b = new String[]{"a", "b", "c"}; 
+0

是的,我提到过。我只是想知道是否有一些标准的方法。 :) – DeGriz

+0

数组构造函数*是*标准方法。 – dimo414

+0

不能与此争论。 :) – DeGriz