2011-12-31 32 views
1

我会在这里解决问题。 这是我迄今为止的方法:我该如何构造一个参数化类型的数组?

public T[] getAllValues() { 
    Serializable[] result = new Serializable[sets.size()]; 
    for (int i = 0; i < sets.size(); i++) { 
     result[i] = sets.get(i).getValue(); 
    } 
    return (T[]) result; 
} 

“T”是扩展序列化的参数化类型。 'sets'是一个ArrayList,它包含一个存储String(key)和T(value)的类型,所以getValue()返回一个T. 在这个方法中,我想返回数组中的所有Ts,所以什么我真的喜欢做看起来更像是这样的:

public T[] getAllValues() { 
    T[] result = new T[sets.size()]; 
    for (int i = 0; i < sets.size(); i++) { 
     result[i] = sets.get(i).getValue(); 
    } 
    return result; 
} 

所以序列化阵列,即铸造至T阵列只是一个想法,一个变通,但不遗憾的是工作。但与此同时,我不能使用第二个版本,因为

new T[int]; 

显然不可能在类型参数化时构造。这是为什么? 更重要的是:我该如何解决它?

预先感谢您

编辑:我的问题解决了,这是我想出了:

public T[] getAllValues(T[] typearray) { 
    for (int i = 0; (i < typearray.length) && (i < sets.size()); i++) { 
     typearray[i] = sets.get(i).getValue(); 
    } 
    return typearray; 
} 
+4

总之:不可能创建通用数组。请参阅http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation – Robin 2011-12-31 16:39:04

+0

欢迎使用Java泛型。 – 2011-12-31 16:41:10

+0

@Tom在编辑中关于您的解决方案:您应该避免使用输入参数作为输出。这对于其他开发人员或未来您来说是相当混乱的。返回相同的阵列也增加了混淆。 – toto2 2011-12-31 18:16:33

回答

1

您应该避免使用一般的阵列,它不会在所有的工作中这个案例。使用List<T>(或Set<T>)而不是数组解决所有问题。

除了评论:
我不知道你在做什么,但似乎不是有sets包含对(String, T)的列表,你可以有一个Map<String, T>。您将不需要您的方法getAllValue(),因为map.values()返回的所有T's。

+0

我解决了这个问题,我确实使用了一个数组。 – 2011-12-31 17:56:18

相关问题