[ https://issues.apache.org/jira/browse/GROOVY-7396?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jochen Theodorou updated GROOVY-7396: ------------------------------------- Labels: (was: usertask) > Static compiler prefers overloaded method taking primitive argument over > object > ------------------------------------------------------------------------------- > > Key: GROOVY-7396 > URL: https://issues.apache.org/jira/browse/GROOVY-7396 > Project: Groovy > Issue Type: Bug > Components: Static compilation > Affects Versions: 2.3.8, 2.4.3 > Environment: OSX Yosemite, JDK 1.8.0_40 > Reporter: Shil Sinha > Assignee: Jochen Theodorou > > If a method is overloaded to accept either a primitive or object argument, > and is called with a wrapper type argument (i.e. Integer, Long, etc.), the > static compiler chooses the primitive version when generating bytecode (or > possibly earlier in compilation). Example: > {code} > import groovy.transform.CompileStatic > @CompileStatic > class Foo { > void monkeyAdd(int a) { > println 'monkeyAdd int' > } > void monkeyAdd(Object a) { > println 'monkeyAdd Object' > } > public static void main(String[] args) { > Integer a = Integer.valueOf(4) > Integer b = null > def foo = new Foo() > foo.monkeyAdd(a) //prints 'monkeyAdd int' > foo.monkeyAdd(b) //throws NPE > } > } > {code} > This is not expected behavior; `monkeyAdd(Object)` should be called in both > cases, as it would be in Java. > The bytecode generated for the `foo.monkeyAdd(a)` call is: > {code} > ALOAD 3 > ALOAD 1 > INVOKEVIRTUAL java/lang/Integer.intValue ()I > INVOKEVIRTUAL me/anyti/Foo.monkeyAdd (I)V > ACONST_NULL > POP > {code} > Similarly, the bytecode generated for the `foo.monkeyAdd(b)` call is: > {code} > ALOAD 3 > ALOAD 2 > INVOKEVIRTUAL java/lang/Integer.intValue ()I > INVOKEVIRTUAL me/anyti/Foo.monkeyAdd (I)V > ACONST_NULL > POP > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)