[ 
https://issues.apache.org/jira/browse/GROOVY-8313?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King closed GROOVY-8313.
-----------------------------

> NullPointerException in TypeResolver when using generic array return type
> -------------------------------------------------------------------------
>
>                 Key: GROOVY-8313
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8313
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Eric Milles
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 2.4.13
>
>
> I think this is related to GROOVY-6899.  I've been trying to isolate this for 
> some time now: https://github.com/groovy/groovy-eclipse/issues/174.  When 
> using a generic array type as a return value, the bridge method is written 
> improperly.
> {code}
> public interface MultiIndexed<PK, SK> {
>   PK getPrimaryKey();
>   SK[] getSecondaryKeys();
> }
> class MIData implements MultiIndexed<Integer, String> {
>   final String value
>   final Integer primaryKey
>   final String[] secondaryKeys
>   MIData(String val, Integer pk, String... sk) {
>     this.value = val
>     this.primaryKey = pk
>     this.secondaryKeys = sk
>   }
> }
> {code}
> javap on MiData.class shows {{public final SK[] getSecondaryKeys();}}.  The 
> equivalent Java class shows a different signature for the bridge method: 
> {{public java.lang.Object[] getSecondaryKeys();}}.
> This causes an NPE under Introspector when bean info is trying to be resolved.
> {code}
> java.lang.NullPointerException
>     at com.sun.beans.TypeResolver.resolve(TypeResolver.java:203)
>     at com.sun.beans.TypeResolver.resolve(TypeResolver.java:162)
>     at com.sun.beans.TypeResolver.resolveInClass(TypeResolver.java:81)
>     at java.beans.FeatureDescriptor.getReturnType(FeatureDescriptor.java:370)
>     at java.beans.Introspector.getTargetEventInfo(Introspector.java:1052)
>     at java.beans.Introspector.getBeanInfo(Introspector.java:427)
>     at java.beans.Introspector.getBeanInfo(Introspector.java:173)
>     at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3289)
>     at java.security.AccessController.doPrivileged(Native Method)
>     at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3287)
>     at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3263)
>     at 
> org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:254)
>     at 
> org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
>     at MiData.$getStaticMetaClass(MiData.groovy)
>     at MiData.<init>(MiData.groovy)
> class Main {
>   static void main(String[] args) {
>     def data = new MIData('V', 1, 'B')
>     print 'no error'
>   }
> }
> {code}
> I think this can be fixed in {{Verifier.getCovariantImplementation}}, like 
> this:
> {code}
>         // if we reach this point we have at least one parameter or return 
> type, that
>         // is different in its specified form. That means we have to create a 
> bridge method!
>         MethodNode newMethod = new MethodNode(
>                 oldMethod.getName(),
>                 overridingMethod.getModifiers() | ACC_SYNTHETIC | ACC_BRIDGE,
>                 // GRECLIPSE edit
>                 //oldMethod.getReturnType().getPlainNodeReference(),
>                 GenericsUtils.nonGeneric(oldMethod.getReturnType()),
>                 // GRECLIPSE end
>                 cleanParameters(oldMethod.getParameters()),
>                 oldMethod.getExceptions(),
>                 null
>         );
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to