Does JLS tell if this program is legal?

Stephan Herrmann stephan.herrmann at berlin.de
Thu May 23 09:01:05 UTC 2024


Thanks, Maurizio,

You're right, I should be more careful in interpreting 'exists' in the spec, 
even in chapter 18, which has a style close to being procedural :)

But then my explanation how javac can possibly accept is gone, so let's see if 
Dan's answer brings us closer to a solution.

Stephan

Am 22.05.24 um 01:13 schrieb Maurizio Cimadamore:
> Hi Stephan,
> commments below:
> 
> On 21/05/2024 20:49, Stephan Herrmann wrote:
>> or a moment I was tempted to challenge the part "if Si and Ti are types (not 
>> wildcards)", perhaps also Inner<?> would be a reason not to create that 
>> constraint, but I gave up that idea when I discovered the following solution:
>>
>> * One<X> is a supertype of S / Y (as the 2nd superinterface of Two<X>)
>> * One<?> is a supertype of T / One<?> (identity)
>> * S1 = X
>> * T1 = ?
>> * NO new constraint is created
>> * inference succeeds to instantiate W#0 = Y
>>
>> In my understanding the weakness here is in "there *exists* a supertype of S 
>> ... (for *some* generic class or interface, G)". Which seems to imply once a 
>> compiler finds one witness for the conditions of that supertype, that's the 
>> only thing that needs to be looked at for this sentence. In fact, the choice 
>> which witness is found by ecj can be toggled by swapping the order of Two's 
>> superinterfaces.
>>
>> Now declaration order is probably a bad thing to decide about accept/reject. 
>> So which criterion should be used to select G?
>>
>> My current implementation draft prefers a "more specific" supertype, which 
>> suffices to select One<X> instead of Super<Inner<X>> in this particular case.
>>
>> Does javac perform an explicit selection in this situation, or does it "just 
>> happen" to find the more helpful supertype?
> 
> The javac code responsible for this is here:
> 
> https://github.com/openjdk/jdk/blob/master/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java#L1000
> 
> For every pair of upper bounds, we compute the set of _all_ the common 
> supertypes, and check them all. So, javac doesn't pick one randomly.
> 
> But, as you can see from the code, javac does leave out type equality test if 
> either type being tested is a wildcard (as per the JLS text).
> 
> The way I read the text is different from the way you read it - I think it's a 
> very declarative way to state a rule - e.g. the incorporation rule just say that 
> if there exist a pair of super type such and such, then a new equality 
> constraint can be derived. Algorithnically, this means that _every_ pair of 
> supertype such and such must be considered. I think it's a presentation style, 
> and doesn't strike me as an issue in the JLS.
> 
> Maurizio
> 



More information about the compiler-dev mailing list