5

コード:

public class Foo {

    static void test(String s){
        System.out.println("String called");
    }

    static void test(int s){
        System.out.println("int called");
    }

    public static void main(String[] args) throws Exception {

        test(5>8? 5:8);         // Line 1
        test(5>8? "he":"ha");   // Line 2

        test(5>8? 5:"ha");      // Line 3

        System.out.println(5<8? 5:"ha"); //Line 4
    }
}

このコードを実行すると、次のエラーが発生しますLine 3

Foo.java:24: error: no suitable method found for test(INT#1)
                test(5>8? 5:"ha");              // Line 3
                ^

三項演算子で同様の型を使用しても、エラーは発生しません。ただし、異なるタイプを使用すると、メソッド呼び出しでのみエラーが発生しますtest(5>8? 5:"ha");が、呼び出しでは機能しますSystem.out.println(5<8? 5:"ha");

別のオーバーロードされたメソッドを追加するとstatic void test(Object s){}//Line 3コンパイルされます。

誰かこのシナリオを説明してくれませんか?

4

3 に答える 3

7

Java のすべての式には型があります。Java 言語仕様の条件演算子に関するセクションには、 などの条件式の型を見つける方法を示す複雑な規則がいくつかあります5 > 8 ? 5 : "ha"。ただし、簡単に言えば、2 番目と 3 番目の引数の両方がメンバーである最も具体的な型を常に取得します。

  • の場合、と5 > 8 ? 5 : 8の両方がであるため、この式全体の型はです。58intint
  • の場合、と5 > 8 ? "he" : "ha"の両方がであるため、この式全体の型はです。"he""ha"StringString
  • の場合、 と の両方に5 > 8 ? 5 : "ha"適合する最も具体的なタイプはです。したがって、この式全体には type があります。5"ha"ObjectObject

testacceptintと acceptのバージョンがあるStringので、式test ( 5 > 8 ? 5 : 8 )test ( 5 > 8 ? "he" : "ha" )両方がコンパイルされます。

testただし、を受け入れるバージョンがない場合はObjecttest ( 5 > 8 ? 5 : "ha" )コンパイルできません。

これは過度の単純化です。ルールは私が説明したよりもかなり複雑ですが、これは主に、nullオペランド、自動ボックス化、自動ボックス化解除を含むさまざまなケースを考慮しているためです。

于 2016-11-10T06:36:58.607 に答える
0

式が評価される前にメソッドを呼び出しています。メソッドにはtest(Object o)のオーバーロードがないため、機能しません。

左辺の式を解決してからメソッドを呼び出します。

5>8?test(5):test("ha")
于 2016-11-10T06:26:04.687 に答える
0

関数を呼び出すとき

test(5>8? 5:8);
メソッド(現在の場合)はパラメーターを送信するためのものであるため、括弧内のすべてがパラメーターと見なされ、intおよびStringを評価しているため、そのような種類の呼び出し(パラメーターはObjectである必要があります)を処理するための適切な/適切なメソッドはありませんステートメントの 1 つに。したがって、そこで三項演算子を実装することはできません。

したがって、このようなコードを使用できます

(5 > 8) ? test(param1): test(param2);


または、Object をパラメーターとして受け入れる別のテスト メソッドを作成し、そのテスト メソッド内の内容を評価します。このような

void test(Object o){
    //manipulate things here
}
于 2016-11-10T06:38:36.770 に答える