Java类构造函数中尖括号的用途是什么?

时间:2013-03-13 18:09:21

标签: java class generic-type-argument

如果你试图通过用某个表达式替换“some expression”来尝试传递一个不扩展public void x(List<Class<some expression>> m)的类,我希望方法class A{}抛出一个错误。

当我使用通配符或不包含通配符时,我总是会收到一个恼人的警告,所以我想理解为什么Class应该得到一个维度,即使我完全偏离它的使用方式。< / p>

1 个答案:

答案 0 :(得分:2)

我不完全得到你想做的事。实际上,这个方法签名:

public void x(List<? extends YourClass> m)
如果你传递的List个类的类没有扩展YourClass,那么

将无法编译(让我们这样称呼它,而不是A)。

如果您希望x方法作为参数获取Class个对象的列表,那么这是另一个问题。你确定你不愿意只传递List类扩展YourClass的对象吗?如果是这样,该方法签名应该有效。

编辑:既然您声明要传递一个类列表,那么这应该有效:

public void x(List<Class<? extends YourClass>> m)

以这种方式测试:

import java.util.*;

class YourClass {}
class YourClassEx extends YourClass {}

public class Test {

    public static void x(List<Class<? extends YourClass>> m) {
        // stuff...
    }

    public static void main(String[] argv) {

        List<Class<? extends YourClass>> list = new ArrayList<>();
        list.add(YourClass.class);
        list.add(YourClassEx.class);
        x(list); // compiles fine until here

        list.add(String.class); // doesn't compile
        x(new ArrayList<Class>()); // doesn't compile, either

    }
}