2009-08-14 4 views
8

В Groovy вы можете совершать неожиданные преобразования типов, используя либо оператор as, либо метод asType. Примеры включаютПреобразование типа Groovy

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

Я удивлен, что я могу конвертировать из Integer к короткому и из набора в список, потому что нет «является» отношения между этими типами, хотя они имеют общий предок.

Например, следующий код эквивалентен Integer/Короткий пример с точки зрения отношений между типами в процессе преобразования

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

def c = new Child1() as Child2 

Но, конечно, этот пример не получается. Что такое правила преобразования типов за оператором as и метод asType?

ответ

7

Я считаю, что поведение по умолчанию asType можно найти в: org.codehaus.groovy.runtime.DefaultGroovyMethods.java org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.java.

Начиная с DefaultGroovyMethods, довольно легко следить за поведением asType для определенного типа объекта и запрошенной комбинации типов.

5

Согласно тому, что Рубен уже указывал на конечный результат:

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

является

Set collection = new ArrayList(new HashSet()) 

Метод asType распознает вы желающих List и быть тот факт, HashSet является Collection, он просто использует конструктор ArrayList, который принимает Collection.

Что касается номеров один, он преобразует Integer в Number, а затем вызывает метод shortValue.

Я не понимал, что существует так много логики в преобразовании ссылок/ценностей, подобных этой, моя искренняя благодарность Рубену за указание источника, я сделаю довольно много сообщений в блоге по этой теме.

Смежные вопросы