方法签名中的参数化列表

时间:2012-01-17 22:07:22

标签: java generics

像下面这样的东西不会给我一个编译时或运行时错误,我正在画一个空白的原因。有没有办法在对cls.add的调用上强制执行编译错误?

为什么类定义中的T的定义不会被转移到内部方法的调用中?我理解我没有以这种方式实例化类,但类状态T的定义必须是数字。

public class NewClass<T extends Number> {

    private List<T> id = new ArrayList<T>();

    public void add(List<T> elem) {
        id.addAll(elem);
    }

    public static void main(String[] args) {
        NewClass cls = new NewClass();
        cls.add(new ArrayList<String>());
    }
}

3 个答案:

答案 0 :(得分:2)

您使用的是原始类型。在这种情况下,所有类型信息都会被忽略,并且会收到警告。

如果您提供类型参数,它将失败:

NewClass<Integer> cls = new NewClass<Integer>();
cls.add(new ArrayList<String>()); //error

答案 1 :(得分:1)

实例化cls时,需要提供泛型类型,例如:

NewClass<Integer> cls = new NewClass<Integer>();

答案 2 :(得分:1)

这将导致警告,因为在这种情况下禁用了泛型的使用(您使用的是原始类型)。这是出于向后兼容的原因。您可以使编译器将警告视为错误:Javac: Treat warnings as errors