通用类转换为相同泛型类型的泛型数组

3

我有一个方法签名,类似于

public <T extends SomeClass> T[] findAll(Class<T> oClass, String condition)

但我不确定如何从Class 创建那个T []类型。 我尝试使用Collection ,但我无法将(T [])collection.toArray()和Array.newInstance(Class ,int)转换。Array.newInstance(Class ,int)要求一个数组类(即T []),这是无用的和冗余的。
另外,显然,new T [n]不起作用。
我会认为这很容易,但现在我对解决方案麻木了 :)
谢谢。
1个回答

5

newInstance方法不需要数组类,它只需要组件类型即可。尽管存在未检查的强制转换和泛型数组的常见问题,但它仍能正常工作。

T[]  myArr = (T[]) Array.newInstance(oClass, length);

但为什么要混合使用数组和泛型呢?这只会导致头痛。使用来自集合API的List之类的东西。


是的,也许像List这样的Collection就可以了,但由于我不希望返回的值是可修改的,所以我更喜欢使用数组而不是Collections.unmodifiableList() - Yanick Rochon
1
@Yanick:但你总是可以修改一个数组!Collections.unmodifiableList()更好地保持了你的集合不可修改。 - Mark Peters
是的,当然,我更多地是指addremove方法;你不能在数组中添加或删除项目。替换值并不重要,但我明白了。 - Yanick Rochon
1
@Yanick:如果您有一个数组(任何引用类型的数组),可以使用 Arrays.asList(array) 将其转换为固定长度列表。因此,您可以使用一个空的 Object[],将其包装成一个列表,将列表强制转换为正确的泛型类型,然后填充它(或先填充再生成列表)。这需要一些 SuppressWarning,但是如果数组在您的方法中保持不变,则应该是安全的。 - Paŭlo Ebermann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接