繁体   English   中英

泛型并创建可比较的对象(Java)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM