Вопрос 1
Не имеет значения, используется ли List
(список объектов) или List<String>
(список строк) в Groovy?
В приведенном ниже примере кода оба списка заканчиваются как ArrayList
(ArrayList объектов). Ожидал бы, что второй список будет ArrayList<String>
(ArrayList of Strings).
Означает ли Groovy информацию о типе при компиляции класса и выводит его при выполнении скомпилированного класса?
Пример 1
List untypedList = ["a", "b", "c"]
List<String> typedList = ["a", "b", "c"]
println "Untyped list List: ${untypedList.getClass()}"
println "Typed list List<String>: ${typedList.getClass()}"
Выход 1
Untyped list List: class java.util.ArrayList
Typed list List<String>: class java.util.ArrayList // Would have expected ArrayList<String>
Вопрос 2
Я бы ожидал, что строка typedList << new Integer(1)
в приведенном ниже примере завершится с ошибкой с исключением, потому что я пытаюсь поместить int
в список строк. Может ли кто-нибудь объяснить, почему я могу добавить int
в String
-typed List
?
Выход показывает, что он остается Integer
, то есть он не на лету преобразован в String
"1".
Пример 2
List untypedList = ["a", "b", "c"]
List<String> typedList = ["a", "b", "c"]
untypedList << new Integer(1)
typedList << new Integer(1) // Why does this work? Shouldn't an exception be thrown?
println "Types:"
println "Untyped list List: ${untypedList.getClass()}"
println "Typed list List<String>: ${typedList.getClass()}"
println "List contents:"
println untypedList
println typedList
println "Untyped list:"
untypedList.each { println it.getClass() }
println "Typed list:"
typedList.each { println it.getClass() }
Выход 2
Types:
Untyped list List: class java.util.ArrayList
Typed list List<String>: class java.util.ArrayList
List contents:
[a, b, c, 1]
[a, b, c, 1]
Untyped list:
class java.lang.String
class java.lang.String
class java.lang.String
class java.lang.Integer
Typed list:
class java.lang.String
class java.lang.String
class java.lang.String
class java.lang.Integer