0

Consider this code segment

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; 
   } 
}

If I execute this lines of code,

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

The results would be : buy(int,double)

I want to know how the compiler decide which method to execute?

Rohit Jain
  • 209,639
  • 45
  • 409
  • 525
chathura
  • 3,362
  • 6
  • 41
  • 68
  • Also go through [Relevant JLS Section](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.9) – Rohit Jain Aug 10 '13 at 09:21

1 Answers1

4

If you have overloaded methods, the compiler figures out the most specific candidate using the method signature. In this case the two signatures are

buy(int, double)

and

buy(long, double).

Note that the return type is not part of the signature. You are calling a method using buy(byte, int). Since int is more specific than long, the first method is called. More specific means that int is the smaller of the two type to contain byte.

However, the compiler cannot figure out the most specific candidate all the time:

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

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

foo(3, 4);

This code will not compile, because it is not clear which of the methods is meant.

Ignavia
  • 166
  • 1
  • 4