web-dev-qa-db-ja.com

必要なキャストのための「冗長キャストへの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をわずかに変更しました。throws Throwableテンプレート からでした。実際のコードはリテラル文字を使用します*そして_String.valueOf(char)過負荷を使用しているString.valueOftoString()は問題があります(OH Java!)。コードはSystem.outなどのグローバル状態を回避し、symbolfailは異なるクラスにあります。 「スイッチ」は非列挙型のタイプのものです。failはアサートのようなメソッドのコンパニオンであるため、それが内部的に(未チェックの非ヌル以外の)例外をスローします。

私は実際にそれを修正したのですか、無関係に、コードを並べ替えたので、そこにもいくつかのリテラル文字列がありました。それ以外の場合は、無意味Object.class.cast(Object)と同等のものを使用しました。私が本当に知りたいことは:WTF?

*実際には本物コードは、リテラルの文字、文字列、さまざまな数字、ブール値、列挙などを区別しないさまざまな言語のために、レクサーを通過します。

22

式の結果をローカル変数に抽出します。

T obj =
        true ? 'a' :
                true ? 'b' :
                        true ? 'c' : fail();
System.out.println(String.valueOf(obj));
 _
1
sponge

'a'String表記ではありません。それを"a"(そして私もユースケースを完全に理解していない - または正規表現エンジンを使って全体で書き込むこともできます)と置き換えます。しかし、無意味な鋳造を避けるために...単にinstanceofで確認してください、あなたがキャストしようとしていること。これに似ていますが、曖昧な通話と無駄なキャスティングのためのスペースがほとんどありません。

0
Martin Zeitler