一般来说,Java 可以被认为是一种类型安全的语言。我知道泛型存在一些缺陷,但我最近遇到了一个以前从未遇到过的问题。
分解它:
Object[] objects = new Integer[10];
objects[0] = "Hello World";
不会像预期的那样导致编译时错误。我假设数组的声明Object
将不允许指向其他内容的数组。在泛型中,我不允许做出这样奇怪的事情,例如:
ArrayList<Object> objs = new ArrayList<Integer>
如果我试图欺骗 Java 做一些事情
ArrayList<? extends Object> objects = new ArrayList<Integer>
我可以声明它,但我只能添加类型的对象null
.
为什么 Java 不阻止声明这种奇怪的数组呢?
首先,我应该指出这是类型安全的。
Object[] objects = new Integer[10];
objects[0] = "Hello World";
因为会抛出异常。 (它不是静态地类型安全...但这完全是不同的说法。)
Java 允许这样做的原因是历史性的。在 Java 5 之前,Java 不支持任何形式的泛型。 Gosling 表示,如果他们有时间弄清楚泛型并将其合并到 Java 1.0 中,他们就会这样做。
不幸的是,他们没有。但他们仍然希望能够编写具有以下签名的通用排序方法之类的东西:
void sort(Object[] array, Comparator comp) ...
为了使这个方法适用于任何类型的对象数组(没有泛型),有必要使数组协变;即使通过String[]
or Integer[]
作为正式类型为的参数Object[]
。如果他们没有这样做,你就必须复制String[]
to an Object[]
,排序,然后复制回来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)