我在谷歌搜索时发现了一个讨论
我发现:
首先,数组不会破坏类型安全。如果他们这样做了,那么在运行时向上转换一个数组就不会失败。它们使编译器无法证明程序类型安全,因此检查被推迟到运行时。
我认为这里发生了混淆,因为一方面,因为 String 是一个 Object 一个 Strings 数组显然是一个 Objects 数组,而另一方面它显然不是。答案在于数组的可变性。
如果数组是不可变的,那么将 String[] 视为 Object[] 是安全的,因为不可变的 String[] 总是与不可变的 Object[] 完全相同。
另一方面,如果数组是可变的,那么将 String[] 视为 Object[] 通常是不安全的。
上述链接中描述的“通配符”技术正是 CommonLisp 多年来一直在做的事情。
(deftype StringArray? () (array String)) ; This is the type of arrays of String
(deftype ObjectArray? () (array Object)) ; This is the type of arrays of Object
(subtypep StringArray? ObjectArray?) ; Is StringArray? a subtype of ObjectArray?? false, true ; No, it isn't. (false: it isn't, true: I'm ure)
(deftype AnyArray? () (array *)) ; This is the type of arrays of anything (subtypep StringArray? AnyArray?) ; Is StringArray? a subtype of AnyArray?? true, true ; Yes, it is. (true: it is, true: I'm sure)