There is an amendment to JLS 15.12.2.2
http://java.sun.com/docs/books/jls/clarifications-2-2nd-ed.html The SDK compiler changed between 1.4.1 and 1.4.2 to be consistent with the amendment.
Here is how we explain the ambiguous reference in its simplest form.
B declares m(int) and inherits m(char). The method invocation m(�x�) could use either method declaration.
1. B.m(int) is more specific than A.m(char) if int can be converted (without casting, widened) to char (No) and B is a subclass of A (Yes)
2. A.m(char) is more specific than B.m(int) if char can be converted (without casting, widened) to int (Yes) and A is a subclass of B (No)
Neither method is most specific, hence an ambiguity.
In the amendment to the JLS, the requirement to check if one class is a subclass of another has been removed. Now, one method is more specific than another only if the parameter types of one can be converted to the parameter types of the other.
Since char can be converted to int, m(char) is more specific than m(int) and the compiler chooses the method declaration m(char). No ambiguity.
[ November 07, 2003: Message edited by: Marlene Miller ]