【发布时间】:2014-03-25 21:57:24
【问题描述】:
问题 1
在 Groovy 中使用 List(对象列表)还是 List<String>(字符串列表)是否无关紧要?
在下面的代码示例中,两个列表最终都是ArrayList(对象的ArrayList)。本来希望第二个列表是ArrayList<String>(字符串数组列表)。
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
【问题讨论】:
-
@tim_yates:所以根据您发布的链接的答案是“[...] 这意味着类型参数在编译时未检查并且在运行时不可用。”这意味着我不能阻止任何人将
int放入List<String>中,这反过来意味着我只能确定List<String>包含object类型的对象。对吗? -
是的。除非你使用
@CompileStatic