これを考慮してください最小、再現可能な例:
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
は テンプレート からでした。実際のコードはリテラル文字を使用します*そして_String.valueOf(char)
過負荷を使用しているString.valueOf
、toString()
は問題があります(OH Java!)。コードはSystem.out
などのグローバル状態を回避し、symbol
、fail
は異なるクラスにあります。 「スイッチ」は非列挙型のタイプのものです。fail
はアサートのようなメソッドのコンパニオンであるため、それが内部的に(未チェックの非ヌル以外の)例外をスローします。
私は実際にそれを修正したのですか、無関係に、コードを並べ替えたので、そこにもいくつかのリテラル文字列がありました。それ以外の場合は、無意味Object.class.cast
(Object)
と同等のものを使用しました。私が本当に知りたいことは:WTF?
*実際には本物コードは、リテラルの文字、文字列、さまざまな数字、ブール値、列挙などを区別しないさまざまな言語のために、レクサーを通過します。 )
式の結果をローカル変数に抽出します。
T obj =
true ? 'a' :
true ? 'b' :
true ? 'c' : fail();
System.out.println(String.valueOf(obj));
_
'a'
はString
表記ではありません。それを"a"
(そして私もユースケースを完全に理解していない - または正規表現エンジンを使って全体で書き込むこともできます)と置き換えます。しかし、無意味な鋳造を避けるために...単にinstanceof
で確認してください、あなたがキャストしようとしていること。これに似ていますが、曖昧な通話と無駄なキャスティングのためのスペースがほとんどありません。