gpt4 book ai didi

java - 编译器为什么以及如何区别对待这两个条件?

转载 作者:搜寻专家 更新时间:2023-11-01 01:14:11 24 4
gpt4 key购买 nike

以下两个代码示例表示相同的逻辑。检查字符串是否为空,并根据该检查进行分支。第一个示例可以安全编译。第二个产生与 Java 泛型相关的类型不匹配错误。我的问题看起来很简单,但它让我难以理解。为什么编译器以不同的方式对待这两个语句?我怎样才能更好地理解这里发生了什么?

/* compiles cleanly */
protected Collection<String> getUserRoles(Object context,
Set<String> mappableRoles) {
String cookieValue = extractCookieValue(context);
if (cookieValue != null) {
return securityService.getRolesForUser(cookieValue);
} else {
return Collections.emptySet();
}
}


/* produces a compiler error */
protected Collection<String> getUserRoles(Object context,
Set<String> mappableRoles) {
String cookieValue = extractCookieValue(context);
return cookieValue == null ? Collections.emptySet()
: securityService.getRolesForUser(cookieValue);
}

来自 Eclipse 的编译器错误。

Type mismatch: cannot convert from Set<capture#1-of ? extends Object> to Collection<String>

根据要求,这是 SecurityService 接口(interface)的相关部分。

public interface SecurityService {
public Set<String> getRolesForUser(String userId);
}

最佳答案

问题应该在于编译器如何解释三元运算符的返回值。你可能想看看 part 15.25 of the JLS或在此question (有点相关,因为它通过自动装箱变得更加复杂,并且它在运行时而不是在编译时抛出错误)。

希望这能让您走上正确的方向。

关于java - 编译器为什么以及如何区别对待这两个条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com