2008-11-13 52 views
3
private void activateRecords(long[] stuff) { 
    ... 
    api.activateRecords(Arrays.asList(specIdsToActivate)); 
    } 

不应该对Arrays.asList的这个调用返回一个列表Long s吗?相反,它返回一个List<long[]>我错过了什么,或者做了可变参数Arrays.asList?

public static <T> List<T> asList(T... a) 

的方法签名的结果是一致的可变参数抛出整个数组到列表中。这是一样new ArrayList(); list.add(myArray)是的,我知道它的意思是这样使用:Arrays.asList(T t1, T t2, T t3)

我想我得到的,是代替可变参数的形式,为什么我不能只是有我的老asList方法(至少我认为这是它的工作原理),它会把内容放入一个列表中并将它们分别放入列表中?任何其他干净这样做的方式?

回答

7

这是因为long []和Long []是不同的类型。

在第一种情况下T是long [],在第二个T中是long。

如何解决这个问题?首先不要使用long []?

+1

谢谢!我现在得到它,但与供应商遗留应用程序的工作不给我的选择“[不]使用long []在第一位” – oreoshake 2008-11-13 00:48:10

+0

然后将long []转换为Long []。我知道,它很愚蠢。 – Pyrolistical 2008-11-13 00:49:35

5

Autoboxing无法在阵列上完成。你被允许这样做:

private List<Long> array(final long[] lngs) { 
    List<Long> list = new ArrayList<Long>(); 
    for (long l : lngs) { 
     list.add(l); 
    } 
    return list; 
} 

private List<Long> array(final long[] lngs) { 
    List<Long> list = new ArrayList<Long>(); 
    for (Long l : lngs) { 
     list.add(l); 
    } 
    return list; 
} 

(请注意,可迭代的类型是不同的)

例如

Long l = 1l; 

但不

Long[] ls = new long[]{1l}