[jira] [Commented] (GROOVY-8342) Static compilation error with a method returning an array in a type parameter

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[jira] [Commented] (GROOVY-8342) Static compilation error with a method returning an array in a type parameter

JIRA jira@apache.org

    [ https://issues.apache.org/jira/browse/GROOVY-8342?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16645315#comment-16645315 ]

Eric Milles commented on GROOVY-8342:
-------------------------------------

This may fix the issue (edit indicated in the 2nd half):
{code:java}
    private static GenericsType applyGenericsContext(Map<String, GenericsType> spec, GenericsType gt) {
        if (gt.isPlaceholder()) {
            String name = gt.getName();
            GenericsType specType = spec.get(name);
            if (specType!=null) return specType;
            if (hasNonTrivialBounds(gt)) {
                GenericsType newGT = new GenericsType(gt.getType(), applyGenericsContext(spec, gt.getUpperBounds()), applyGenericsContext(spec, gt.getLowerBound()));
                newGT.setPlaceholder(true);
                return newGT;
            }
            return gt;
        } else if (gt.isWildcard()) {
            GenericsType newGT = new GenericsType(gt.getType(), applyGenericsContext(spec, gt.getUpperBounds()), applyGenericsContext(spec, gt.getLowerBound()));
            newGT.setWildcard(true);
            return newGT;
        }
        ClassNode type = gt.getType();
        /* GRECLIPSE edit
        if (type.getGenericsTypes()==null) return gt;
        ClassNode newType = type.getPlainNodeReference();
        newType.setGenericsPlaceHolder(type.isGenericsPlaceHolder());
        newType.setGenericsTypes(applyGenericsContext(spec, type.getGenericsTypes()));
        */
        ClassNode newType;
        if (type.isArray()) {
            newType = applyGenericsContext(spec, type.getComponentType()).makeArray();
        } else {
            if (type.getGenericsTypes()==null) return gt;
            newType = type.getPlainNodeReference();
            newType.setGenericsPlaceHolder(type.isGenericsPlaceHolder());
            newType.setGenericsTypes(applyGenericsContext(spec, type.getGenericsTypes()));
        }
        GenericsType newGT = new GenericsType(newType);
        return newGT;
    }
{code}

> Static compilation error with a method returning an array in a type parameter
> -----------------------------------------------------------------------------
>
>                 Key: GROOVY-8342
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8342
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation
>            Reporter: M. Justin
>            Priority: Major
>
> A compilation error occurs when using static compilation and attempting to assign the result of a method that returns a parameterized argument that contains an array in the type parameter.  The equivalent Java code has no issues.
> Here is a specific example:
> {code}@CompileStatic
> class ArrayGenericsIssue {
>   static void main(String[] args) {
>     Optional<Integer[]> value = testArrayMethod(1) //This fails to compile
>   }
>   static <E> Optional<E[]> testArrayMethod(E ignored) {
>     return Optional.empty()
>   }
> }{code}
> The error returned is:
> {code}Error:(11, 33) Groovyc: [Static type checking] - Incompatible generic argument types. Cannot assign java.util.Optional <E[]> to: java.util.Optional <Integer[]>{code}
> The expected behavior is that this code would compile and run successfully with @CompileStatic enabled.
> Note that equivalent code with a non-array generic parameter works just fine:
> {code}
>   static void main(String[] args) {
>     Optional<List<Integer>> value = testListMethod(1)
>   }
>   static <E> Optional<List<E>> testListMethod(E ignored) {
>     return Optional.empty()
>   }
> {code}
> Additionally, there is no compilation issue if the value is cast:
> {code}Optional<Integer[]> value = (Optional<Integer[]>) testArrayMethod(1){code}
> For some context, I'm running into this issue when working with [jOOQ|https://www.jooq.org/], as some of its API involves working with array type parameters.



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