0

このコードセグメントを検討してください

class StockServer { 

   StockServer(String company, int Shares,double currentPrice, double cashOnHand) {}

   double buy(int numberOfShares, double pricePerShare) { 
        System.out.println("buy(int,double)"); 
        return 3.0;
   } 

   float buy(long numberOfShares, double pricePerShare) {     
        System.out.println("buy(long,double)");
        return 3.0f; 
   } 
}

このコード行を実行すると、

StockServer a = new StockServer("",2,2.0,2);
byte b=5;
a.buy(b,2);

結果は次のようになります: buy(int,double)

コンパイラがどのメソッドを実行するかを決定する方法を知りたいですか?

4

1 に答える 1

4

メソッドをオーバーロードした場合、コンパイラはメソッド シグネチャを使用して最も具体的な候補を見つけ出します。この場合、2 つの署名は

buy(int, double)

buy(long, double).

戻り値の型は署名の一部ではないことに注意してください。buy(byte, int) を使用してメソッドを呼び出しています。int は long よりも具体的であるため、最初のメソッドが呼び出されます。より具体的には、int が byte を含む 2 つの型のうち小さい方であることを意味します。

ただし、コンパイラは常に最も具体的な候補を見つけ出すことはできません。

public static void foo(long a, double b) {
    // body
}

public static void foo(double a, long b) {
    // body
}

foo(3, 4);

どのメソッドが意図されているかが明確でないため、このコードはコンパイルされません。

于 2013-08-10T09:24:45.087 に答える