每次我认为我更好地理解泛型(并且可以在不编译的情况下回答)时,我都会遇到一个这个理论被打破的例子。这是一个非常简单的例子:
static void consumer(List<? super List<String>> param) {
System.out.println(param);
}
和两个调用:
public static void main(String[] args) {
List<String> list = List.of("123");
consumer(list);
consumer(List.of("123"));
}
对我来说,任何调用都不应该编译。AString
不是 的超类型List
。尽管如此,第二个编译。但是让我们假设发生这种情况是因为编译器可以在这里推断出某种类型。当然这样的类型不存在,它会在运行时失败,对吧?对?没有。它只是工作。因此,有人可以给我的生活带来一些理智吗?