【问题标题】:Parameterized Lists in method signature方法签名中的参数化列表
【发布时间】:2012-01-17 22:07:22
【问题描述】:

类似下面的内容不会给我一个编译时或运行时错误,我对原因一无所知。有没有办法在调用 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>());
    }
}

【问题讨论】:

    标签: java generics


    【解决方案1】:

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

    如果提供类型参数,会失败:

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

    【讨论】:

    • 我认为这与原始类型的使用有关。我想也许有一种方法可以使用诸如 public void add(List elem) 但没有骰子之类的东西来强制执行 T 的定义。感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

    • 好点。从未想过将警告视为错误设置。
    【解决方案3】:

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

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

    【讨论】:

    • 不,检查仍将在cls 上,它也需要一个泛型类型。您仍在使用原始类型。
    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多