【问题标题】:Generic class to array of generics of same generic type泛型类到相同泛型类型的泛型数组
【发布时间】:2011-04-11 20:03:26
【问题描述】:

我有一个类似的方法签名

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

但我不确定如何从 Class&lt;T&gt; 创建 T[] 类型。我已经尝试使用Collection&lt;T&gt;,但我无法转换(T[]) collection.toArray()Array.newInstance(Class&lt;?&gt;, int) 已经要求一个数组类(即T[]),这是没有用的和多余的。

另外,很明显,new T[n] 不起作用。

我认为这很容易,但我现在对解决方案已经麻木了 :)

谢谢。

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    newInstance 不要求数组类,它要求组件类型。它可以正常工作,尽管存在未经检查的强制转换和泛型数组的常见问题。

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

    但是为什么要混合使用数组和泛型呢?只会让人头疼。使用 Collections API 中的内容,例如 List

    【讨论】:

    • 是的,也许像List 这样的Collection 应该没问题,但是由于我不希望返回的值是可修改的,所以我更喜欢使用数组而不是Collections.unmodifiableList()
    • @Yanick:但是你总是可以修改一个数组! Collections.unmodifiableList() 在保持您的收藏不可修改方面做得更好。
    • 是的,当然,我更多地指的是addremove 方法;您不能在数组中添加或删除项目。如果无关紧要,则替换一个值,但点已被采纳。
    • @Yanick:如果你有一个数组(任何引用类型),你可以使用Arrays.asList(array) 将它转换成一个固定长度的列表。所以你可以使用一个空的 Object[],将它包装成一个列表,将列表转换为正确的泛型类型,然后填充它(或先填充,然后生成列表)。这需要一个 SuppressWarning,但如果数组保留在您的方法中,它应该是安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多