[ https://issues.apache.org/jira/browse/GROOVY-9059?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16901316#comment-16901316 ]
Eric Milles commented on GROOVY-9059: ------------------------------------- Taking another look at this, it appears that {{GenericsUtils.addMethodGenerics}} is where the information loss occurs for groovyc. {code:java} public static Map<String, ClassNode> addMethodGenerics(MethodNode current, Map<String, ClassNode> oldSpec) { Map<String, ClassNode> ret = new HashMap<String, ClassNode>(oldSpec); // ret starts with the original type specs, now add gts for the current method if any GenericsType[] sgts = current.getGenericsTypes(); if (sgts != null) { for (GenericsType sgt : sgts) { String name = sgt.getName(); if (sgt.isPlaceholder()) { ClassNode redirect; if (sgt.getUpperBounds() != null) { redirect = sgt.getUpperBounds()[0]; } else if (sgt.getLowerBound() != null) { redirect = sgt.getLowerBound(); } else { redirect = ClassHelper.OBJECT_TYPE; } ClassNode type = ClassHelper.makeWithoutCaching(name); type.setGenericsPlaceHolder(true); // type is "O" and redirect is "T -> Object" type.setRedirect(redirect); // after this, type is "O -> Object"; "T" has been lost ret.put(name, type); } else { ret.put(name, sgt.getType()); } } } return ret; } {code} For the {{correctToGenericsSpec}} calls to work after this, "T" must be retained in the redirect of "O". > Failed to parse/compile generic methods with "extends" > ------------------------------------------------------ > > Key: GROOVY-9059 > URL: https://issues.apache.org/jira/browse/GROOVY-9059 > Project: Groovy > Issue Type: Bug > Components: Static compilation > Affects Versions: 2.4.16, 3.0.0-alpha-4, 2.5.6 > Reporter: Xiaoguang Wang > Priority: Major > Attachments: image-2019-03-30-13-10-20-819.png > > > > {code:java} > import groovy.transform.CompileStatic > // This bug affects: groovy-2.4.16, groovy-2.5.6, groovy-3.0.0-alpha-4 > // This bug also affect IDEA's syntax parser > interface X<T> { > // Intellij IDEA reports that 'public' is not necessary > // BUT without the 'public' modifier, there is a syntax error > public <T> T foo(T o); > } > interface Y<T> { > public <O extends T> O foo(O o); > } > @CompileStatic > class TestGroovyGeneric { > static void main(String[] args) { > def x = new X<String>() { > // it compiles > // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not > implemented > @Override > String foo(String o) { return o } > } > // Strangely, such code compiles > // BUT: Intellij IDEA reports: ERROR: Method 'foo' is not implemented > def y1 = new Y<String>() { > @Override > public <String> String foo(String o) { return o } > } > // Can not compile: > // BUT: Intellij IDEA reports no error .... > def y2 = new Y<String>() { > @Override > String foo(String o) { return o } > } > } > } > {code} > !image-2019-03-30-13-10-20-819.png! > -- This message was sent by Atlassian JIRA (v7.6.14#76016)