“冗余强制转换为 java.lang.Object”警告,用于必要的强制转换
考虑这个最小的,可重复的例子:
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。 来自模板。真正的代码确实使用文字字符*,而在其他地方,它使用重载,所以有问题(哦,Java!该代码避免全局状态,如 和 ,并且位于不同的类中。“开关”属于不可枚举类型。 是类似断言的方法的伴随,因此这就是为什么它在内部引发(未经检查的非空)异常的原因。throws Throwable
String.valueOf
String.valueOf(char)
toString()
System.out
symbol
fail
fail
我实际修复它的方式是,不相关的是,我重新排列了代码,所以那里也有一些文字字符串。否则,我会使用毫无意义的等价物。我真正想知道的是:wtf?Object.class.cast
(Object)
*实际上,真正的真实代码通过不同语言的词法分析器,该语言不区分文字字符,字符串,各种数字,布尔值,枚举等。为什么会这样呢?)