【问题标题】:Convert Class[] to generics?将 Class[] 转换为泛型?
【发布时间】:2008-11-17 21:45:47
【问题描述】:

我仍在尝试使用 Java 的泛型。使用类型化集合我完全没有问题,但其余的大部分似乎都让我无法理解。

现在我正在尝试使用 JUnit“PrivateAccessor”,它需要一个 Class[] 参数,其中包含被调用的私有方法的所有参数类型的列表。在 Java 1.4 中,我将其定义为

Class[] args = new Class[] { Collection.class, ArrayList.class };

但实际代码现在被定义为接受参数

myMethod(Collection<MyClass1> first, ArrayList<MyClass2> second)

我试图将 args 的定义更改为

Class<? extends Object>[] args = new Class<? extends Object>[] 
{ Collection<MyClass1>.class, ArrayList<MyClass2>.class };

但是 Eclipse 在结束的 >s 上放置了一个红色标记,并表示此时它正在等待“void”。我可以使用泛型来做到这一点,还是不应该打扰?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    你遇到的第一个问题是你应该使用

    Class<?>[] args = new Class[]
    

    而不是

    Class<? extends Object>[] args = new Class<? extends Object>[]
    

    This 解释了原因。

    你的第二个问题是你应该使用

    { Collection.class, ArrayList.class };
    

    而不是

    { Collection<MyClass1>.class, ArrayList<MyClass2>.class };
    

    这是因为 XXX.class 是在运行时评估的,在执行type erasure 之后,所以指定类型参数是无用的,因此被禁止。

    我强烈推荐FAQ,我从中链接了上面的两个解释,以便对 Java 泛型进行“世俗”的理解,这将澄清大多数问题。

    【讨论】:

      【解决方案2】:

      这是正确的语法:

      Class<?>[] paramTypes = new Class[]{ Collection.class, ArrayList.class };
      

      【讨论】:

        【解决方案3】:

        您可能想阅读Angelika's FAQ 以了解有关为什么不允许创建具体参数化类型的数组的更多说明。

        yc

        【讨论】:

        • 刚刚注意到我重复发布了 bdumitriu 引用的链接。但这会直接带您进入我们正在讨论的主题。
        猜你喜欢
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多