use*_*289 4 java arrays covariance covariant
有几个人告诉我,Java 允许协变数组子类型化,换句话说,如果 A 是 B 的子类型,则 A[] 是 B[] 的子类型,但这是一个糟糕的特性,因为它会导致运行时错误。有人能给我一个具体的例子来说明它如何导致运行时错误以及 Java 是否/如何解决这个问题?
很简单。
String strings[] = {"Broken","Type", "system"};
Object objects[] = strings;
objects[0] = 5; // compiles fine, but throws ArrayStoreException at runtime
Run Code Online (Sandbox Code Playgroud)
协变类型只要你把东西拿出来就不错了,但是当你把东西放进去的那一刻,整个东西就坏了。想象一下,您有一个方法将 Object[] 作为参数。
fn(Object[]a){
...
}
Run Code Online (Sandbox Code Playgroud)
能够用 a 调用它不是很好String[]吗?
String[] s = {"I","didn't","know","that","this","was","broken"}
fn(s);
Run Code Online (Sandbox Code Playgroud)
嗯,能够这样做听起来很自然,尤其是在我们语言中没有泛型的早期。只要没有任何变化,所有这些都可以正常工作,Java 不提供任何机制来保证这一点。
你应该总是青睐Lists过arrays,因为Lists使用generics它是不变的。
| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |