Per Nyfelt created GROOVY-11749:
-----------------------------------

             Summary: CompileStatic issues in Groovy 5
                 Key: GROOVY-11749
                 URL: https://issues.apache.org/jira/browse/GROOVY-11749
             Project: Groovy
          Issue Type: Bug
         Environment: Groovy 5.0.0, Gradle 8.14.3,  JVM: 21.0.6
            Reporter: Per Nyfelt


When working on getting the Matrix project to work with Groovy 5 i encountered 
the following differences compared to 4.0.28 for static compilation:

f is a csv commons formatter. The setHeader method has the following signature:

f.setHeader(String... headers)

In 4.0.28 i used to be able to just cast a List<String> to a String[] like this:
if (val instanceof List) {
  f.setHeader({*}val as String[]{*})
 
But in Groovy 5 this gives me the following error:
java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class 
[Ljava.lang.String; (java.util.ArrayList and [Ljava.lang.String; are in module 
java.base of loader 'bootstrap')
 
A workaround is to use the Java way i.e:

if (val instanceof List) {
  f.setHeader(val.toArray({*}new String[0]) as String[{*}])


Another thing i hade to change was


static String asColumnName(int number) {
  StringBuilder sb = new StringBuilder()
  while (number-- > 0) {
    sb.append(('A' as char + (number % 26)) as char)
    *number /= 26*
  }
  return sb.reverse().toString()
}

Which no longer compiles:
.../SpreadsheetUtil.groovy: 45: [Static type checking] - Cannot assign value of 
type java.math.BigDecimal to variable of type int

but had to be changed to 


static String asColumnName(int number) {
  StringBuilder sb = new StringBuilder()
  while (number-- > 0) {
    sb.append(('A' as char + (number % 26)) as char)
    *number = (int) (number / 26)*
  }
  return sb.reverse().toString()
}
 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to