Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 if三元运算符和集合。emptyList()_Java_Generics_Casting - Fatal编程技术网

Java if三元运算符和集合。emptyList()

Java if三元运算符和集合。emptyList(),java,generics,casting,Java,Generics,Casting,你能解释一下为什么第一个返回类型不能编译代码吗? 消息为:类型不匹配:无法从列表转换为列表 在第二种情况下是否插入了显式强制转换 public class GenericsTest { private String getString() { return null; } public List<String> method() { String someVariable = getS

你能解释一下为什么第一个返回类型不能编译代码吗? 消息为:
类型不匹配:无法从列表转换为列表

在第二种情况下是否插入了显式强制转换

public class GenericsTest {

        private String getString() {
            return null;
        }

        public List<String> method() {
            String someVariable = getString();
            //first return type
            //return someVariable == null ? Collections.emptyList() : Collections.singletonList(someVariable);
            //second return type
            if (someVariable == null) {
                return Collections.emptyList();
            } else {
                return Collections.singletonList(someVariable);
            }
        }
    }
公共类泛型测试{
私有字符串getString(){
返回null;
}
公共列表方法(){
String someVariable=getString();
//第一返回类型
//return someVariable==null?Collections.emptyList():Collections.singletonList(someVariable);
//第二返回类型
if(someVariable==null){
返回集合。emptyList();
}否则{
返回集合。singletonList(someVariable);
}
}
}

因为类型推断规则。我不知道确切的原因(您应该检查JSL,),但三元表达式似乎没有从返回类型推断类型参数

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


使用
Collections.emptyList()
显式设置类型

,因为
Collections.emptyList()
不返回
列表
。将方法的结果显式设置为
List
,这意味着您必须返回这样的列表

比如说

return Collection<String>.emptyList(); 
return Collection.emptyList();

返回新的ArrayList();

那就行了

表达式的类型
标志?trueCase:falseCase
是这两种情况中最常见的类型


在这种情况下,最常见的
Collections.emptyList()
Collections.singletonList(someVariable)
类型是
list。您能详细解释一下吗?问题不在于如何修复它,而在于我所能回答的。我现在懒得深入研究JLS,但我可以验证规则不需要(事实上不允许)深入检查,这对于让三元运算符的使用编译是必要的。这些信息都在那里,所以如果有正确的规则,这当然是可能的。事实并非如此:
集合。singletonList(“string”)
确实返回
列表和
集合。emptyList()
可以返回
列表,具体取决于上下文(如示例代码中的第二个
返回
所示)-1:事实上不正确。Collections.emptyList()和Collections.singletonList(“字符串”)实际上是返回列表。问题在于泛型的类型推断。我很乐意收回否决票。我当然没有看到你的更正。只是要注意:Tobias从一开始就编写了
列表
,但由于它没有标记为代码,
部分被解释为HTML标记,因此被悄悄删除。它仍然不是100%正确,但没有声称
Collections.emptyList()
不会返回
List
。感谢您的更正,下次我将使用特殊字符标记代码。
return new ArrayList<String>();
return Collections.emptyList();