codeconsole commented on PR #3285:
URL: https://github.com/apache/groovy/pull/3285#issuecomment-6812789846

   @paulk-asert thanks. I compiled your programs and some neighbours against 
javac 25.0.4 and this branch.
   
   **1. A bound that names another type parameter.** Fixed in efa0808656. The 
capture is now checked against the bounds of the type parameter that the bound 
names, and when the bound gives that type parameter type arguments, as 
`List<T>` does, `T` is inferred from the capture's bound first. Both of your 
programs are rejected, and the `List<? extends Integer>` and `Class<? extends 
ArrayList<Integer>>` forms compile. So do these, as in javac:
   
   - rejected: `<T extends Integer, U extends T>` for a `List<? extends 
Number>`, and `<K extends Number, V, U extends Map<K, V>>` for a `Class<? 
extends HashMap<String, Integer>>`
   - accepted: `<K extends Number, V, U extends Map<K, V>>` for a `Class<? 
extends HashMap<Integer, String>>`, `<T extends Comparable<T>, U extends T>` 
for a `List<? extends Integer>`, and `<T, U extends T>` for a `List<? extends 
String>`
   
   The cases are in `GenericsSTCTest` (so `GenericsStaticCompileTest` too) and 
`GenericsJavaCompatibilityTest`. The negative ones fail on the previous 
revision. One related difference is left, and it predates this PR: `<T extends 
Number, U extends T> v(T t, List<U> l)` with a `Double` and a `List<? extends 
Integer>` is rejected, where javac widens `T` and accepts it. Master rejects it 
too.
   
   **2. `GROOVY_6_0_X`.** I built the accept-only variant you describe, to see 
whether it holds. On `GROOVY_6_0_X`, a capture the check does not admit falls 
through to the existing `compatibleConnection` path instead of being rejected. 
I compiled the 115 programs I have been using for this PR against the 
`GROOVY_6_0_X` tip and against the variant:
   
   - Nothing that the tip accepts is rejected by the variant.
   - 34 programs that the tip rejects compile. 31 of them javac accepts, 
including `first(List<? extends Integer>)`, `len(Class<? extends String>)`, 
`Collections.sort` on a `List<? extends Integer>`, and the `U extends T` cases 
above.
   - The other three are `C.<Integer>first(ints)`, `Double d = first(ints)` and 
`String s = first(ints)` for a `List<? extends Integer>`. javac rejects them, 
and master with this PR accepts them too; these are the explicit-type-argument 
and assignment points from my earlier reply. The tip rejected them only because 
it rejected every `? extends` argument for a bounded type parameter.
   
   On that branch, the static type checking, static compilation and generics 
tests pass, except the negative tests for calls that `GROOVY_6_0_X` accepts 
(`narrow` and the others listed in the COMPATIBILITY entry), which would be 
left out of a port. The variant is a local branch for now; I'm happy to open it 
as a PR against `GROOVY_6_0_X` with those tests adjusted, or to leave the port 
to whatever you and @daniellansun decide.
   
   On the overload observation: understood, and no change from me there.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to