Неявное преобразование типов? - PullRequest
2 голосов
/ 17 ноября 2011

Я просматриваю чужой код Grails и вижу следующее:

Set<Integer> weeks = new ArrayList<Integer>()

Похоже, что после того, как эта строка установлена, Граилс считает, что недели - это HashSet. Я не очень хорошо разбираюсь в Java или Grails, и документация (java) выглядит так, как будто ArrayList расширяет List, а HashSet расширяет Set, но эта прямая конструкция не будет работать. Это вещь Грааля? Спасибо.

1 Ответ

4 голосов
/ 17 ноября 2011

В Groovy несколько необычно видеть new ArrayList<Integer>(), поскольку [] работает идентично и менее многословно, поэтому я бы написал это как Set<Integer> weeks = [].Тогда немного яснее, что происходит - Groovy конвертирует один тип коллекции в другой, с помощью [], который является действительно удобным способом создания держателя и заполнения начальных данных (если они есть).Поскольку нет синтаксического сахара для коллекций, отличных от [] для List и [:], вам нужны эти преобразования.

def weeks = [] as Set, вероятно, является наиболее распространенным синтаксисом.Это также более понятно, поскольку [] является просто временным и использует «as» для преобразования, и более явно, чем просто объявление типа на левой стороне.

Вы также можете использовать это для преобразования коллекций в массивы,Вы не можете использовать синтаксис Java для создания массивов, так как он использует фигурные скобки и выглядит как определение Closure, поэтому вместо int[] numbers = new int[] { 1, 2, 3 } вы должны сделать int[] numbers = [1, 2, 3] или def numbers = [1, 2, 3] as int[].

...