问题1
在Groovy中使用List
(对象列表)还是List<String>
(字符串列表)是否无关紧要?
在下面的代码示例中,这两个列表最终都变成了一个ArrayList
(对象的ArrayList)。本来期望第二个列表会是ArrayList<String>
(字符串的ArrayList)。
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
类型的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
int
放入List<String>
中,这反过来又意味着我只能确定List<String>
包含类型为object
的对象。正确吗? - Lernkurve@CompileStatic
,否则是这样的。 - tim_yates