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]
