java - 如何让编译器禁止对上限引用进行方法调用

标签 java generics io

我知道以下语法不合法:

void dolist2(List<? extends Number> list) {
    list.add(new Integer(3));
}

但我不知道编译器如何知道它不合法。如果我查看 List.java 的源代码,我会看到:

boolean 值add(E e);

我认为这个声明没有任何特别之处,甚至没有像 @IllegalWhenInvokedOnUpperBoundReference 这样的注释。编译器如何知道强制执行此限制?如何对我自己的类(class)设置类似的限制?

最佳答案

它知道是因为 Integer不是 ? extends Number 的实例。 ? extends Number表示:未知类型,它是或扩展 Number。由于类型未知,编译器无法判断 Integer 是有效类型,因此拒绝编译。

您无法将字符串添加到 List<Integer>要么,因为编译器知道 String 不扩展 Integer。类型检查是编译器的作用之一。

您似乎认为这是 List 具有而您的代码所没有的特殊功能。它不是。这只是泛型类型的规则:

public class Whatever<T> {
    public void foo(T e) {
    }

    public static void main(String[] args) {
        Whatever<? extends Number> w = new Whatever<Integer>();
        w.foo(new Integer(4)); // won't compile
    }
}

关于java - 如何让编译器禁止对上限引用进行方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18373569/

相关文章:

C# 通用协变错误

ruby - 如何查看文件缓冲区的当前状态?

java - 在java中以正确的方式声明单例,并正确初始化私有(private)哈希表

java - java中的翻转字符

java - 使用 Spring AOP 记录方法条目

java - 在 java 8 上运行 JStack 会停止所有线程吗?

Java 泛型 : actual class as a generic parameter

java - 具有泛型返回类型的棘手静态泛型方法本身可能是泛型

perl - 当 perl 中有 < FH >、<> 或 < * > 时,内部会发生什么?

c++ - 有没有办法确保 float 的输出在不同的操作系统中相同?