Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
1.7.5
-
None
Description
Simple file, A.groovy:
class A<String> { } class B { void foo(String s) {} }
groovyc A.groovy
javap -private B | grep foo
produces:
public void foo(java.lang.Object);
The 'String' is treated as a type parameter name. The reference 'String' in the foo method is mapped to this type parameter (clearly it shouldn't be) and when producing the code, String is erased to its upper bound of Object, hence foo(Object) in the bytecode.
Change it to this:
class A<T> { } class B { void foo(String s) {} }
and it produces what you expect:
public void foo(java.lang.String);
The problem is the genericParameterNames collection in the ResolveVisitor is never cleared, only augmented with new entries.
My solution that seems to work in groovy eclipse is to clear the parameter names at the end of visiting a classnode in ResolveVisitor. So at the end of
public void visitClass(ClassNode node) {
add
genericParameterNames.clear();