strange choice of method

Stephan Herrmann stephan.herrmann at berlin.de
Mon Jun 9 21:51:12 UTC 2025


Thanks, Jan, for clarifying.

I was confused by a discussion among Eclipse committers from 2008, who had 
observed some back-and-forth in the behavior of javac between 1.4, 1.5, claiming 
that 1.7ea went back to the 1.4 behavior (accept). Obviously, after 2008 nobody 
had rechecked their assessment.

Your explanation makes sense, and we will have to fix ecj in this regard.

Stephan

> This is what I think happens:
> 
> - for M1, the `a(String)`, `c()` and `c(String)` are not members of the
> class, while `a()` is (as per JLS 8.2, private members are not inherited)
> 
> - for M1, when seeing `a(null)`, the determined type to search (JLS
> 15.12.1) is M1, as there's a method called `a` in this class (note that
> arity does not play a role in this step). Hence `a()` is the only candidate.
> 
> - for M1, when seeing `c(null)`, there's no `c(...)` in `M1`, so the
> search goes to the enclosing/outer scope (i.e. the determined type to
> search is X), where it finds `c()` and `c(String)`, where the second one
> is resolved.
> 
> - for M2, neither `a(..)`, nor `c(...)` are in M2, so the search goes to
> the enclosing/outer scope in both cases, and the resolution finds
> `a(String)` and `c(String)` respectively, from the enclosing scope.
> 
> 
> Do I miss something?
> 
> 
> Jan
> 
> 
> On 09. 06. 25 0:22, Stephan Herrmann wrote:
>> In the following code javac raises exactly one error:
>>
>> //--------------
>> public class X {
>> ??????? void a() {}
>> ??????? private static void a(String s) {}
>> ??????? private void c() {}
>> ??????? private static void c(String s) {}
>> ??????? static class M1 extends X {
>> ??????????????? public void x() {
>> ??????????????????????? a(null);
>> ??????????????????????? c(null);
>> ??????????????? }
>> ??????? }
>> ??????? static class M2 {
>> ??????????????? public void x() {
>> ??????????????????????? a(null);
>> ??????????????????????? c(null);
>> ??????????????? }
>> ??????? }
>> }
>> //----------------
>>
>> The first call "a(null)" is rejected, because the no-arg instance
>> method is selected, whereas the second such call is accepted,
>> targeting the static method.
>>
>> Also both calls "c(null)" are accepted.
>>
>> Is there any intention behind this?
>>
>> thanks,
>> Stephan
>>
>> PS: These observations hold for version 5 through 25 ea. javac 1.4
>> actually accepts the program. Not sure if it helps understanding the
>> why of it.




More information about the compiler-dev mailing list