【发布时间】:2017-09-10 23:14:49
【问题描述】:
这是来自 Mark Weiss 教授在他的书Java 中的数据结构和算法分析
public class BinaryHeap<AnyType extends Comparable<? super AnyType>>{
private void enlargeArray( int newSize ){
AnyType [] old = array;
array = (AnyType []) new Comparable[ newSize ];
for( int i = 0; i < old.length; i++ )
array[ i ] = old[ i ];
}
}
我想知道为什么我们要声明一个具有 Comparable 接口类型的数组,因为我们必须将 Comparable[] 转换为 AnyType[]?里面有什么设计理念吗?
【问题讨论】:
-
因为不能创建 AnyType[] 类型的数组。
-
@user2357112 并没有那么错。编译器将生成一个未经检查的强制转换警告,但是当您必须将泛型类型的对象存储在数组中时,您真的无法做得更好。只要数组是私有的并且不暴露,就可以了。
-
@LewBloch 他们没有:-)
-
@JBNizet:是的,如果没有明确的
Class对象,你就无法摆脱未经检查的演员表,但最好对元素执行未经检查的演员表(实际上预计会有您将它们转换为的类型)而不是数组(绝对不是您将其转换为的类型)。 -
@user2357112 虽然可以正常工作,但如果您尝试在数组中存储 AnyType 以外的内容,至少会导致编译器抱怨。如果您使用 Comparable[],情况就不会如此。顺便说一句,com.sun.jmx.remote.internal.ArrayQueue 类确实使用了它。