Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中条件表达式中的空列表_Java_Generics_Collections_Arraylist_Conditional Operator - Fatal编程技术网

Java中条件表达式中的空列表

Java中条件表达式中的空列表,java,generics,collections,arraylist,conditional-operator,Java,Generics,Collections,Arraylist,Conditional Operator,以下代码段发出编译器错误 public List<Long> test() { boolean b=true; return b ? Collections.emptyList() : Collections.emptyList(); } 然后它编译得很好 为什么第一个案例不编译?在jdk-7u11上进行测试。对于三元表达式,编译器没有机会根据测试方法的返回类型推断方法Collections.emptyList()的返回类型。相反,首先它必须解决(三元)表达式的结果

以下代码段发出编译器错误

public List<Long> test()
{
    boolean b=true;
    return b ? Collections.emptyList() : Collections.emptyList();
}
然后它编译得很好


为什么第一个案例不编译?在jdk-7u11上进行测试。

对于三元表达式,编译器没有机会根据
测试
方法的返回类型推断方法
Collections.emptyList()
的返回类型。相反,首先它必须解决(三元)表达式的结果类型。由于未提及该类型,它将变成
List
,并且与
test
方法的返回类型不兼容


但是在
return Collections.emptyList()
中,它有可用的(右)上下文(即
test
方法的返回类型),用于推断
Collections.emptyList()
的返回类型应该是什么。

简而言之,三元表达式不从返回类型推断类型参数,而是从它的两个结果表达式。由于这种嵌套,必须先确定两种结果类型,然后才能确定三元的总体结果

三值表达式的类型取决于其操作数的类型,但其中一个操作数()具有未确定的类型参数。此时,三元表达式仍然没有类型,因此它不能影响类型参数。可以推断两种类型-一种是三元表达式的结果,另一种是
.emptyList()
方法的类型参数


正如您所发现的,修复方法是通过编码
Collections.emptyList()
来显式指定调用的方法类型,从而显式设置类型,然后可以使用该类型来确定三元表达式的类型,然后根据返回类型来检查该类型。

这是一个非常好的解释。+1表示正确且切中要害的答案。
public List<Long> test()
{
    boolean b=true;
    return b ? Collections.<Long>emptyList() : Collections.<Long>emptyList();
}
public List<Long> test()
{
    return Collections.emptyList();
}
public List<Long> test()
{
    boolean b=true;

    if(b)
    {
        return Collections.emptyList();
    }
    else
    {
        return Collections.emptyList();
    }        
}