[
https://issues.apache.org/jira/browse/GROOVY-11107?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17735727#comment-17735727
]
Eric Milles edited comment on GROOVY-11107 at 6/21/23 2:12 PM:
---------------------------------------------------------------
If your use case is to create an {{EnumSet}} of all of the enum constants, you
can use {{EnumSet.allOf(Test1)}} to do that.
The runtime matches 3 candidate methods under Java 11:
{code:java}
Set Set.of(Object...)
Set Set.of(Object, Object, Object, Object, Object, Object)
EnumSet EnumSet.of(Enum, Enum...)
{code}
The middle one matches based on the return values of
{{MetaClassHelper#calculateParameterDistance}}.
was (Author: emilles):
The runtime matches 3 candidate methods under Java 11:
{code:java}
Set Set.of(Object...)
Set Set.of(Object, Object, Object, Object, Object, Object)
EnumSet EnumSet.of(Enum, Enum...)
{code}
The middle one matches based on the return values of
{{MetaClassHelper#calculateParameterDistance}}.
> EnumSet varargs constructor is not recognized (broken) in runtime
> -----------------------------------------------------------------
>
> Key: GROOVY-11107
> URL: https://issues.apache.org/jira/browse/GROOVY-11107
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.5.22, 3.0.17
> Reporter: Anton Panikov
> Priority: Major
>
> EnumSet.of() has 6 overloaded variants, the one with varargs is throwing
> GroovyRuntimeException, claiming it can not find a proper constructor. But it
> is working for jdk 8 with any Groovy version: 2.4, 2.5, 3.0 and 4.0, broken
> for jdk 11 and 17 with 2.5 and 3.0 and working fine for groovy 4.0 with any
> jdk.
> It is a runtime exception and the code needs to access the field:
>
> {code:java}
> package test
> enum Test1 {
> ONE,
> TWO,
> THREE,
> FOUR,
> FIVE,
> SIX
>
> public static EnumSet<Test1> test1 = EnumSet.of(ONE, TWO, THREE, FOUR,
> FIVE, SIX)
> //public static EnumSet<Test1> test2 = EnumSet.of(ONE, TWO, THREE, FOUR)
> + EnumSet.of(FIVE, SIX) // workaround to not use varargs, works for any
> combinations
> }
> class Application {
> static void main(String[] args) {
> Test1.test1
> }
> }
> {code}
> It was working fine in groovy 2.4 and all groovy version using jdk 8. But in
> groovy 2.5 and 3.0, using JDK 11 and 17 it is throwing an exception:
> {code:java}
> Exception in thread "main" java.lang.ExceptionInInitializerError
> at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native
> Method)
> at
> java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1042)
> at
> java.base/jdk.internal.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
> at
> java.base/jdk.internal.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:186)
> at java.base/java.lang.reflect.Field.acquireFieldAccessor(Field.java:1105)
> at java.base/java.lang.reflect.Field.getFieldAccessor(Field.java:1086)
> at java.base/java.lang.reflect.Field.get(Field.java:418)
> at
> org.codehaus.groovy.reflection.CachedField.getProperty(CachedField.java:70)
> at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1890)
> at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3827)
> at
> org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:50)
> at
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:329)
> at test.Application.main(Application.groovy:20)
> Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
> Cannot cast object '[FOUR, ONE, TWO, SIX, FIVE, THREE]' with class
> 'java.util.ImmutableCollections$SetN' to class 'java.util.EnumSet' due to:
> groovy.lang.GroovyRuntimeException: Could not find matching constructor for:
> java.util.EnumSet(test.Test1, test.Test1, test.Test1, test.Test1, test.Test1,
> test.Test1)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:402)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:315)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:273)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:230)
> at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:615)
> at test.Test1.<clinit>(Application.groovy:14)
> ... 13 more
> Suppressed: groovy.lang.GroovyRuntimeException: Could not find matching
> constructor for: java.util.EnumSet(SetN)
> at
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1835)
> at
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1605)
> at
> org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:1067)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:378)
> ... 18 more{code}
> Although it is working fine in groovy 4 in all JDK: 8, 11 and 17.
>
> ||Groovy\JDK||JDK8||jdk-11.0.19+7||jdk-17.0.7+7||
> |2.4.21|{color:#00875a}V{color}|N/A|N/A|
> |2.5.22|{color:#00875a}V{color}|{color:#de350b}X{color}|{color:#de350b}X{color}|
> |3.0.17|{color:#00875a}V{color}|{color:#de350b}X{color}|{color:#de350b}X{color}|
> |4.0.12|{color:#00875a}V{color}|{color:#00875a}V{color}|{color:#00875a}V{color}|
> Also, static compilation of enum is also fixing the problem. I am using
> CentOS 7 and AdoptNet(Temurin) Java, see versions of groovy and java in the
> table above.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)