当前位置: 首页 > 面试题库 >

Java三元运算符对泛型类型推断的影响

贲功
2023-03-14
问题内容
public List<String> foo1() {
    List<String> retval = bar();
    if (retval == null)
        return Collections.emptyList();
    else
        return retval;
}

public List<String> foo2() {
    List<String> retval = bar();
    return retval == null ? Collections.emptyList() : retval;
}

为什么foo1()编译正常但foo2()有错误?(更确切地说, “类型不匹配:无法从List
转换为List

我本以为两个函数都可以编译为相同的字节码,所以一个聪明的编译器应该为emptyList()… 推断正确的类型。


问题答案:

我可以在Java 8中正常编译。

Java的早期版本可能需要更多帮助

return retval == null ? Collections.<String>emptyList() : retval;

应该管用。

编辑 这是由于Java 8类型推断的改进,如此处所述

http://openjdk.java.net/jeps/101

这是一个重点介绍的博客:http :
//blog.jooq.org/2013/11/25/a-lesser-known-java-8-feature-generalized-target-
type-in​​ference/



 类似资料:
  • 问题内容: Java通常可以基于参数(甚至与返回类型(例如,与C#相反))来推断泛型。 恰当的例子:我有一个通用类,它只存储一对值,并且可以按以下方式使用: 该方法如下所示: 非常好。但是,这不再适用于以下需要通配符的用例: (请注意显式强制转换以进行正确的类型。) 代码失败,并显示以下错误(由Eclipse提供): 类型不匹配:无法从转换为 但是,显式调用构造函数仍然可以按预期工作: 有人可以解

  • 问题内容: 我读到从Java 7开始,像在第一条语句中那样在右侧指定类型来创建Collections是不好的样式,因为编译器可以从左侧推断类型。 我的问题是,当像这样初始化列表时,编译器找不到类型,并且我收到未经检查的类型警告: 问题答案: 编译器不会 推断 类型,因为您正在实例化 raw 。但是它足够聪明,可以警告您在使用此(原始)对象时可能会出现问题。 值得一提的是此警告背后的原因。由于类型擦

  • null 这是有意义的,但是在编译时的类型是什么?它是还是其他东西?

  • 问题内容: 我正在尝试编写一种获取a的方法,以验证数字是否在点后有东西,如果有,则返回a ,如果没有则返回a 。 输出: 因此,我想要的一切都发生在method中,但没有发生在method中。这些方法似乎必须完成相同的工作。但是我做错了什么? 问题答案: 正如其他答案所指出的,此行为是因为三元表达式的两个可能结果都必须具有相同的类型。 因此,您要做的所有事情都可以使三元版本的工作方式与将强制转换为

  • 问题内容: 我了解编译器使用目标类型来确定使通用方法调用适用的类型参数。例如,在以下语句中: 其中的签名中具有类型参数 在这种情况下,推断出的类型参数是。 现在考虑以下几点: 在这种情况下,推断的类型是什么?是吗 还是因为通配符告诉编译器任何类型都是可能的? 问题答案: 通配符的每种用法都有与之关联的不同类型。(通常,JLS将此称为“新鲜类型”。)例如,这就是这样的编译器错误的工作方式: 因为在这

  • 我知道编译器使用目标类型来确定使泛型方法调用适用的类型参数。例如,在以下声明中: 其中