[ https://issues.apache.org/jira/browse/GROOVY-10049?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17415663#comment-17415663 ]
Lyuben Atanasov commented on GROOVY-10049: ------------------------------------------ The regression is not the parser error. I have reported it separately here: GROOVY-10236. I had to fix the parser error the way you describe to even reach the static type checker. The problem is that the original fix which was done between 4.0.0-alpha-3 and 4.0.0-beta-1 was working, i.e. this code compiled successfully after the fix was applied: {code} class Test { <T extends Number> Set<T> generateNumbers(Class<T> numberType) { // mock return value, needed to demonstrate the issue return Collections.emptySet(); } <T extends Number> void printNumbers(Class<T> numberType) { generateNumbers(numberType).stream() .filter(num -> num.doubleValue() > 0) .forEach(num -> println "$num"); } } {code} Now, after the release of 4.0.0-beta-1, it fails again. So something must have happened in the mean-time. > STC fails when calling a generic method from another generic method > ------------------------------------------------------------------- > > Key: GROOVY-10049 > URL: https://issues.apache.org/jira/browse/GROOVY-10049 > Project: Groovy > Issue Type: Bug > Components: Static Type Checker > Affects Versions: 3.0.8, 4.0.0-alpha-3, 4.0.0-beta-1 > Environment: OpenJDK 8 > Reporter: Lyuben Atanasov > Assignee: Eric Milles > Priority: Major > Fix For: 4.0.0-beta-1 > > Attachments: screenshot-1.png, screenshot-2.png > > > The static type checker fails to properly determine the return type of a > generic method when that method is called from another generic method. Here's > an example: > {code} > class Test { > <T extends Number> Set<T> generateNumbers(Class<T> numberType) { > // mock return value, needed to demonstrate the issue > return Collections.emptySet(); > } > <T extends Number> void printNumbers(Class<T> numberType) { > generateNumbers(numberType).stream() > .filter(num -> num.doubleValue() > 0) > .forEach(num -> println "$num"); > } > > } > {code} > With static type checking enabled, compilation of this class fails: > {noformat} > Script_bbf0c00c9b2872d2a3528c2d80bbaa49.groovy: 10: [Static type checking] - > Cannot find matching method java.lang.Object#doubleValue(). Please check if > the declared type is correct and if the method exists. > @ line 10, column 19. > .filter(num -> num.doubleValue() > 0) > {noformat} > If we call the {{generateNumbers()}} method with a specific class, everything > works: > {code} > class Test { > <T extends Number> Set<T> generateNumbers(Class<T> numberType) { > return Collections.emptySet(); > } > void printNumbers() { > generateNumbers(Integer).stream() > .filter(num -> num.doubleValue() > 0) > .forEach(num -> println "$num"); > } > > } > {code} > It looks like the static type checker does not properly take into account the > generic types of the surrounding method and thus fails to determine the type > of the returned value. -- This message was sent by Atlassian Jira (v8.3.4#803005)