考虑这个最小的,可重现的例子:
interface Code {
static void main(String[] args) {
symbol(
String.valueOf(
true ? 'a' :
true ? 'b' :
true ? 'c' :
fail()
)
);
}
private static void symbol(String symbol) {
System.out.println(symbol);
}
private static <R> R fail() {
throw null;
}
}
(接近最小,true
是一个有用的布尔表达式的替代品。我们可以忽略第一个? :
(在实际代码中,有很多)。)
这“显然”给出了错误。
4: reference to valueOf is ambiguous
both method valueOf(java.lang.Object) in java.lang.String and method valueOf(char) in java.lang.String match
好的,让我们修复它。这是String.valueOf(Object)
我想要的超载 - 我以后可能想添加:
true ? "sss" :
(事实上,我之前确实有类似的东西,但现在已经删除了该功能。)
String.valueOf((Object)(
true ? 'a' :
fail()
))
这给出了警告:
4: redundant cast to java.lang.Object
这是编译器警告或错误中的错误,我该如何修复它以使代码合理并且没有警告或错误?
(编辑:我稍微更改了 MRE。throws Throwable
来自模板。真正的代码确实使用文字 chars* 并且String.valueOf
在其他地方它使用了String.valueOf(char)
重载,所以toString()
是有问题的(哦 Java!)。代码避免了全局状态,例如System.out
, 和symbol
并且fail
在不同的类中。“开关”是不可枚举的类型。fail
是类断言方法的伴侣,这就是它在内部抛出(未经检查的非空)异常的原因。
我实际上是如何修复它的,不相关的是,我重新排列了代码,所以那里也有一些文字字符串。Object.class.cast
否则,我会使用(Object)
. 我真正想知道的是:wtf?
*实际上,真正的真实代码通过不同语言的词法分析器,它不区分文字字符、字符串、各种数字、布尔值、枚举等。为什么会这样?)