2009-12-24 14 views
5

Groovy è ancora un superset di Java? In caso negativo, quali sono le incompatibilità tra Groovy e Java?Groovy Superset di Java

Per superset, intendo la compatibilità con le origini, nel senso che: è possibile prendere un file Java e compilarlo come file di origine Groovy, e funzionerebbe come prima. È stato l'obiettivo di Groovy di rendere molto simile a Java, per ridurre al minimo la curva di apprendimento. Tuttavia, fino a Groovy 1.7 non c'era supporto per le classi interne anonime e simili.

Ho visto alcuni articoli fare tale affermazione, ma non ho visto verificato sul Groovy website.

+1

In realtà, io non sono sicuro di aver capito la domanda. Cosa intendi esattamente per "fonte compatibile con"? –

risposta

7

Groovy è un superset di (cioè compatibile con Java) ancora? In caso contrario, quali sono le incompatibilità tra Java e Groovy ora?

Groovy "estende" Java e ci sono differenze tra Groovy e Java (un file Groovy non può essere compilato dal compilatore Java). La pagina Differences from Java elenca tutte le principali differenze tra Java e Groovy. Detto questo, Groovy Compiler può convertire un file Groovy in un file .class che può essere eseguito utilizzando l'interprete Java (ciò richiede che groovy-all-VERSION.jar si trovi sul CLASSPATH). Questo risponde alla domanda?

+0

Grazie, ho aggiornato la domanda per chiarire il mio punto. – notnoop

5

Una differenza che non ho visto menzionata su quella pagina è il modo in cui i metodi sovraccaricati vengono risolti. In Java, si basa sul tipo di argomento in fase di compilazione, mentre in Groovy si basa sul tipo di runtime. Diciamo per esempio si dispone di questi metodi in una classe

void doIt(Object o) {} // Java 
void doIt(String s) {} // Groovy 

Il seguente codice:

Object o = "foo"; 

Sarebbe richiamare il metodo con il parametro stringa se il codice Groovy, e il metodo con il parametro oggetto se il codice Java . Groovy chiama questa funzione "multi-metodi".

+0

Grazie. Questo è noto come "dispacciamento dinamico multi-metodo" in letteratura. – notnoop

1

In groovy, proprietà con accesso al pacchetto (beh, dovrei chiamare quegli attributi o variabili di istanza, forse) ottenere automaticamente i setter ei metodi getter compilati nel file di classe.

Ciò significa che se si salva un file * .java come file * .groovy e si dispone di un attributo come "Nome stringa"; il compilatore groovy genererà un setter e un getter. Il compilatore Java non lo farà. Se hai già un getter nel tuo file java, anche il compilatore groovy potrebbe lamentarsi di una definizione di metodo duplicata.

Tuttavia, a meno che per casi rari la maggior parte dei file * .java vengano compilati dal compilatore groovy senza problemi.

Angelo

0

Un'altra differenza non elencati in quella pagina è l'uso di un punto e virgola. Ogni linea dovrebbe essere in grado di terminare con un punto e virgola (ma che può essere omesso).

Il seguente codice non può essere compilato su Groovy, ma compila su Java:

String s = "hello " 
+ "world"; 
println(s); // Assuming there is a local method with name "println" (available by default in Groovy but you have to create it in Java)