Código Java válido que NO es un código Groovy válido?


La mayoría del código Java es también un código Groovy sintácticamente válido. Sin embargo, hay algunas excepciones que me llevan a mi pregunta:

¿Qué construcciones/características en Java son sintácticamente inválidas en Groovy? Proporcione ejemplos concretos de código Java (Java 1.6) que NO es un código Groovy válido (Groovy 1.6).

Actualización:

Hasta ahora tenemos cinco ejemplos de código Java sintácticamente válido que no es un código Groovy válido:

  1. Matriz inicializaciones
  2. Clases internas
  3. def es una palabra clave en Groovy, pero no en Java
  4. "$$"-strings-parsed as an invalid GString s in Groovy
  5. Bloques de inicialización no estáticos -- class Foo { Integer x; { x = 1; } }

Es esta la lista completa? ¿Algún otro ejemplo?

Actualización # 1: He comenzado una recompensa para eliminar esta pregunta. La recompensa se otorgará a la persona que proporcione la lista más completa de ejemplos. Hasta ahora hemos descubierto cinco ejemplos, pero estoy seguro de que hay un poco más por ahí. Así que sigan viniendo!

Author: Zach Lysobey, 2009-03-27

8 answers

Aquí hay una lista de elementos que son válidos para Java 6, pero no para Groovy 1.6. Esta no es una lista completa, pero creo que cubre la mayoría de los casos.

(Por cierto, creo que debería tener en cuenta que los bloques de inicialización no estáticos FUNCIONAN en Groovy.)

Cualquier declaración de clase interna

Incluyendo estática,

public class Outer{
  static class Inner{}
}

No estático,

public class Outer{
  class Inner{}
}

Clases locales,

public class Outer{
  public static void main(String[] args) {
    class Local{}  
  }
}

Y clases anónimas

java.util.EventListener listener=new java.util.EventListener(){};

Usando palabras clave Groovy como variables

int def;
int in;
int threadsafe;
int as;

Inicialización del array

String[] stuff=new String[]{"string"};
int[] array={1,2,3};

Usar signos de dólar en cadenas donde lo que sigue no es una expresión válida

String s="$$";
String s="$def";
String s="$enum";
String s="$;";
String s="$\\";
//etc.

Más de un inicializador en un bucle for

for (int i=0, j=0; i < 5; i++) {}

Más de un incremento en un bucle for

int j=0;
for (int i=0; i < 5; i++,j++) {}

Descomponer algunas expresiones usando nuevas líneas

int a= 2 
/ 2 
;

Interruptor final con un caso que no tiene cuerpo

switch(a){
  case 1:
}

Tener un valor predeterminado en un interruptor sin cuerpo

Se aplica en ambos casos cuando el incumplimiento está al final

int a=0;
switch(a){
    default:
}

O en algún lugar en el medio

switch(a){
    default:
    case 1:
        break;
}

Anotaciones con listas

@SuppressWarnings({"boxing","cast"})

Declaración del método nativo

public native int nativeMethod();

Clase por enumeración

public enum JavaEnum{
  ADD{
    public String getSymbol(){ return "+"; }
  };
  abstract String getSymbol();
}

Do loop

do{
  System.out.println("stuff");
}while(true);
 31
Author: Peter Dolberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-11 19:12:34

Bien, aquí hay un punto:

int[] i = { 0, 1, 2 };

Esa es una buena sintaxis en java, mala en groovy.

No creo que quieras asumir que cualquier código java será equivalente en groovy. Este sitio describe algunas de las diferencias, que incluye cosas tan básicas como == no significa lo mismo en ambos idiomas. Además, la inicialización de matrices estáticas es diferente, y no hay clases internas anónimas.

Esto compila bien en Java 1.6

public class Test2 {
    int[] i = { 0, 1, 2 };

    private class Class1 {
        public void method1() {
            if (i[2] == 2) {
                System.out.println("this works");
            }
        }
    }

    public void method1() {
        Class1 class1 = new Class1();
        class1.method1();
    }
}

Pero está tan equivocado en Groovy. Da los siguientes errores en Groovy 1.6:

unexpected token: 1 @ line 2, column 14.

Class definition not expected here. Possible attempt to use inner class. Inner classes not supported, perhaps try using a closure instead. at line: 4 column: 2.

Si arreglas esas cosas, imprime lo que esperas, sin embargo.

Si está buscando problemas de sintaxis del lenguaje más nuevos, como genéricos o anotaciones, Groovy admite ambos, aunque no del todo.

 12
Author: John Ellinwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-23 02:37:30

Matrices multidimensionales, donde no se especifica el tamaño.

def x=new Object[5][];  // ERROR: expression expected 

def x=new Object[5][2]; // this works
 2
Author: user339047,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-27 06:09:38

Todo lo que puedo pensar por ahora:

  • int def;
  • String s = "$$";
 1
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-26 22:15:20

Complementando la respuesta de Peter Dolberg:

Además del código Java válido que no es válido en Groovy, también debe tener cuidado con el código que es válido tanto en Java como en Groovy, pero que tiene resultados diferentes en Groovy. Ejemplos obvios son los literales char y gStrings:

System.out.println(String.valueOf('3' + 3)); // 54 in Java, 33 in Groovy (arithmetic ascii value vs. String concat)

System.out.println("${3+4}");

Accesos implícitos:

class Foo {public static int counter; public static int bar; public static void getBar() {counter++; return bar;}}
System.out.println(Foo.bar);
System.out.println(Foo.counter); // 0 in Java, 1 in Groovy

ToString() ha sido sobrescrito por GroovyDefaultMethods, que puede morder al analizar el resultado.

Map someMap = new HashMap();
someMap.put("a", "b")
someMap.toString();

La operación es igual a

"foo" == "foo"
class Foo {public boolean equals() {return true;}}
new Foo() == new Foo()

Algunos precedencia del operador:

a *= b/100; // Groovy: (a *= b)/100; Java: a *= (b/100);

Esta no es una respuesta correcta a la pregunta original, ya que el código groovy todavía es sintácticamente válido en sí mismo, pero ya que tiene un resultado diferente, creo que vale la pena mencionarlo aquí. El resultado es que algorítmicamente, un método puede devolver el resultado incorrecto(no válido) cuando se copia de Java a Groovy.

 1
Author: tkruse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-18 18:22:32

Bloques de inicialización no estáticos:

class Foo {
  Integer x;   
  { x = 1; }
}

ACTUALIZACIÓN: Este es de hecho un código Groovy válido.

 0
Author: Jen S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-13 18:59:33

¿Alguien ha mencionado la diferencia en ==? Tomé esto de la documentación de Grails.

== significa igual en todos los tipos. En Java hay una parte wierd de la sintaxis donde = = significa igualdad para tipos primitivos y = = significa identidad para objetos.

 0
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-03 23:13:31

Declarar una matriz de un tipo dado usando [] después del nombre de la variable en lugar del tipo funciona en Java pero no Groovy.

byte[] buff = new byte[1024]; // Works

byte buff[] = new byte[1024]; // Not Groovy

Resulta en un tipo primitivo literal: byte no se puede usar como nombre de método

 0
Author: DSoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-01 18:01:26