java - 为什么这个通用代码可以编译?

标签 java generics

<X> X foo(List<? super X> list)
{
    return null;
}
void test()
{
    List<Number> list = ...;
    String s1 = this.foo(list); // huh?
}

最后一行没有任何意义,javac怎么允许呢?

现在,foo() 方法也没有意义;它必须返回 null,没有其他值可以以类型安全的方式返回。因此,运行时的最后一行不会导致任何问题:它将 null 分配给 String 变量。

仍然,静态地,为什么最后一行编译? (javac 1.6 u21 b06)

最佳答案

what compilers do you guys use?

他们可能正在使用 eclipse,因为它不在那里编译。但它是从命令行编译的。 Eclipse 有一些不同的编译机制,以便更快地找出运行时问题。有时它们只是警告,在这种情况下是错误。

List<? super X>意味着它可以是List<X>List<Object> .因此它可以编译。另一方面,它不会运行,但 javac 不关心,它会为您编译代码。

关于java - 为什么这个通用代码可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083290/

相关文章:

C# 泛型 : default non-null value for member

java - HttpClient:ServiceUnavailableRetryStrategy和HttpRequestRetryHandler有什么区别?

java - 无法读取通过 .a 实现 JNI 的 .so 和 Ubuntu x64、Netbeans IDE 上的主应用程序

java - 独立服务器上的 Bukkit 插件之间的通信

generics - 如何在 PowerShell 中向下转换函数的返回值?

java - 关于我的代码的类型错误的非法开始

java - LinkedBlockingQueue 是生产者消费者场景的正确选择吗?

java - Java 中的字符串池,编译时与运行时字符串评估

java - 如果类/接口(interface)具有 val 属性或具有泛型类型的函数,为什么类/接口(interface)不能以 out 作为前缀?

java - 如何将 Int 添加到通用 Arraylist,我不确定我是否疯了或者是否不可能