public class MethodSelection {
public Class constructedWith;
// constructors
public MethodSelection( Object o ) {
constructedWith = o.getClass();
System.out.println("selected object constr");
}
public MethodSelection( String o ) {
constructedWith = o.getClass();
System.out.println("selected string constr");
}
public MethodSelection( long o ) {
constructedWith = Long.TYPE;
System.out.println("selected long constr");
}
public MethodSelection( int o ) {
constructedWith = Integer.TYPE;
System.out.println("selected int constr");
}
public MethodSelection( byte o ) {
constructedWith = Byte.TYPE;
System.out.println("selected byte constr");
}
public MethodSelection( short o ) {
constructedWith = Short.TYPE;
System.out.println("selected short constr");
}
public MethodSelection() {
constructedWith = Void.TYPE;
System.out.println("no args constr");
}
// static method selection
public static Class get_static( Object o ) {
System.out.println("selected object method");
return o.getClass();
}
public static Class get_static( String o ) {
System.out.println("selected string method");
return o.getClass();
}
public static Class get_static( int o ) {
System.out.println("selected int method");
return Integer.TYPE;
}
public static Class get_static( long o ) {
System.out.println("selected long method");
return Long.TYPE;
}
public static Class get_static( byte o ) {
System.out.println("selected byte method");
return Byte.TYPE;
}
public static Class get_static( short o ) {
System.out.println("selected short method");
return Short.TYPE;
}
public static Class get_static() {
System.out.println("selected no args method");
return Void.TYPE;
}
// dynamic method selection
public Class get_dynamic( Object o ) {
System.out.println("selected object method");
return o.getClass();
}
public Class get_dynamic( String o ) {
System.out.println("selected string method");
return o.getClass();
}
public Class get_dynamic( int o ) {
System.out.println("selected int method");
return Integer.TYPE;
}
public Class get_dynamic( long o ) {
System.out.println("selected long method");
return Long.TYPE;
}
public Class get_dynamic( byte o ) {
System.out.println("selected byte method");
return Byte.TYPE;
}
public Class get_dynamic( short o ) {
System.out.println("selected short method");
return Short.TYPE;
}
public Class get_dynamic() {
System.out.println("selected no args method");
return Void.TYPE;
}
/*
If we try to invoke an instance method through a static context
javac will error... rather than take the widening match.
See methodselection2.bsh
*/
public static Class staticVsDynamic1( Object obj ) {
System.out.println("Object");
return Object.class;
}
public Class staticVsDynamic1( String obj ) {
System.out.println("String");
return String.class;
}
public static void main( String [] args ) {
System.out.println("should be string");
new MethodSelection().staticVsDynamic1( "foo" );
System.out.println("should be object");
new MethodSelection().staticVsDynamic1( new Object() );
}
private String foo( Integer x ) { return "private"; }
public String foo( String x ) { return "public"; }
}