2009-08-14 8 views
8

In Groovy è possibile eseguire conversioni di tipo sorprendenti utilizzando l'operatore as o il metodo asType. Gli esempi includonoConversione tipo Groovy

Short s = new Integer(6) as Short 
List collection = new HashSet().asType(List) 

Sono sorpreso che posso convertire da un intero in una breve e da un set a una lista, perché non c'è "è una" relazione tra questi tipi, anche se condividono una comune antenato.

Ad esempio, il codice seguente è equivalente al/example intero breve in termini di relazione tra i tipi coinvolti nella conversione

class Parent {} 
class Child1 extends Parent {} 
class Child2 extends Parent {} 

def c = new Child1() as Child2 

Ma naturalmente questo esempio non riesce. Quali sono esattamente le regole di conversione del tipo dietro l'operatore as e il metodo asType?

risposta

5

Secondo quanto Ruben ha già evidenziato il risultato finale:

Set collection = new HashSet().asType(List) 

è

Set collection = new ArrayList(new HashSet()) 

Procedimento asType riconosce si vogliono un List ed essendo il fatto HashSet è un Collection, usa solo il costruttore ArrayList che prende uno Collection.

Come per i numeri uno, converte lo Integer in un Number, quindi chiama il metodo shortValue.

Non mi rendevo conto che c'era molta logica nel convertire riferimenti/valori come questo, la mia sincera gratitudine a Ruben per aver indicato la fonte, farò alcuni post su questo argomento.