JDK-7034316 : MethodType.hasWrappers() returns 'true' for method types like '()Comparable' or '()Deprecated'
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang.invoke
  • Affected Version: 7
  • Priority: P2
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2011-04-06
  • Updated: 2012-03-22
  • Resolved: 2011-05-17
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7Resolved
Related Reports
Duplicate :  
Relates :  
Relates :  
Description
Please see the minimized test below to reproduce the issue.

Minimized test:
===============
$ cat test.java
import java.lang.invoke.MethodType;
import static java.lang.invoke.MethodType.*;

public class test {

    private final static Class[] RETURN_TYPES = {
        void.class, boolean.class, byte.class, char.class, short.class,
        int.class, long.class, float.class, double.class,
        Void.class, Boolean.class, Byte.class, Character.class, Short.class,
        Integer.class, Long.class, Float.class, Double.class,
        Enum.class, Comparable.class, Thread.State.class, Deprecated.class,
        boolean[].class, byte[].class, char[].class, short[].class,
        int[].class, long[].class, float[].class, double[].class,
        Void[].class, Boolean[].class, Byte[].class, Character[].class, Short[].class,
        Integer[].class, Long[].class, Float[].class, Double[].class,
        Enum[].class, Comparable[].class, Thread.State[].class, Deprecated[].class
    };

    public static void main(String[] args) {
        for (int i = 0;  i < RETURN_TYPES.length; i++) {
            Class rtype = RETURN_TYPES[i];
            MethodType mt = methodType(rtype);
            
            if (isWrapperType(rtype) != mt.hasWrappers()) {
                System.out.println("hasWrappers() failed for method type "
                        + mt + ": expected \"" + isWrapperType(rtype) + "\", "
                        + "was given \"" + mt.hasWrappers() + "\"");
            }
        }
    }

    private static boolean isWrapperType(final Class cl) {
        if (cl.equals(Void.class) || cl.equals(Boolean.class)
                || cl.equals(Byte.class) || cl.equals(Character.class)
                || cl.equals(Short.class) || cl.equals(Integer.class)
                || cl.equals(Long.class) || cl.equals(Float.class)
                || cl.equals(Double.class)) {
            return true;
        }
        return false;
    }
}

$ java -showversion -verify -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic test
java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b136)
Java HotSpot(TM) Server VM (build 21.0-b06, mixed mode)

hasWrappers() failed for method type ()Comparable: expected "false", was given "true"
hasWrappers() failed for method type ()Deprecated: expected "false", was given "true"

Comments
EVALUATION Interfaces are erroneously recognized as wrappers. There is point fix for this.
13-05-2011