[英]Generics and creating a comparable object (Java)
public class ArrayHeap<T extends Comparable<T>> implements Heap<T>{
...
public ArrayHeap(int capacity){
heap = (T[]) new Comparable[capacity];
}
嗨,在堆= ...上有一个简单的问题,所以在课堂上,我们一直在讨论堆,并使用数组(使用泛型类型)实现堆。 仅做一些检查,就无法了解第5行的实际情况。
因此,我们无法创建通用类型的对象,通常我希望看到:
heap = (T[]) new Object[capacity]
即,如果我要阅读本节及其内容:将堆设置为将新Object强制转换为类型T的通用数组的结果,并将大小设置为容量。
我的问题是,怎么行:
heap = (T[]) new Comparable[capacity];
被阅读? 是创建新的Comparable对象还是实现可比较接口的新对象?
new Comparable[N]
将创建一个阵列N
可容纳元件Comparable
或任何亚型Comparable
。 没有创建Comparable
,只是一个数组。
对于转换,通常,如果您执行了(String[]) new Comparable[N]
,则会得到ClassCastException
因为它不是有效的转换。 但是,对T[]
的强制转换未经检查,这意味着强制转换在表达式的特定位置不会发生。 取而代之的是 ,将ArrayHeap
类型转换删除,并且在ArrayHeap
类之外的其他地方,有一些类似以下的代码:
ArrayHeap<String> h = ...;
String s = h.get(...);
并且在编译过程中将其替换为以下内容:
ArrayHeap h = ...;
String s = (String) h.get(...);
因此,我们可以说它有点像(T[])
强制转换。
但是,要点是,当您执行(T[]) new Comparable[N]
时,实际上并没有得到T[]
(T[]) new Comparable[N]
。 您只是在欺骗编译器,以便在ArrayHeap
类的主体内提供更好的静态类型检查。 如果您尝试将Comparable[]
作为T[]
返回给外界,则会出现异常。
它正在创建一个可以容纳Comparable
对象的数组。 重要的一点是, 只允许数组容纳Comparable
对象。 new Object[capacity]
将被允许容纳任何东西。
您真正想要的是一个T[]
-意味着,该数组仅限于容纳应该与堆一起使用的特定类型T
但这是不可能的,因为Java的泛型是如何工作的( 类型擦除 )。 由于T
是实现Comparable
所必需的,因此,下一个最好的事情是Comparable
的数组。
但是,这仍然很尴尬,并且您会从编译器收到有关将Comparable
用作原始类型的警告。 最好将heap
定义为List<T>
,并使用new ArrayList<>(capacity)
对其进行初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.