为何Java中可使用new创建Comparable数组?
关于
new Comparable[]合法性的解释 你这里的核心误区是混淆了创建接口实例和创建接口类型的数组两个完全不同的操作:
- 首先,你说得没错:Java里确实不能直接用
new Comparable()创建接口的实例,因为接口本身没有具体实现,无法被实例化。 - 但
new Comparable[capacity]做的不是创建接口实例,而是创建一个数组对象——这个数组的元素被限定为必须是Comparable接口的实现类对象,数组本身是一个合法的引用类型对象,所以这个语法完全合法。
再说说代码里强转成T[]的原因:
Java的泛型采用编译期擦除机制,运行时T的具体类型信息会被擦除成它的上界Comparable<T>。如果直接写new T[capacity],运行时JVM不知道T到底是什么类型,无法创建对应类型的数组。所以只能先创建Comparable[]数组(因为T extends Comparable<T>,T的实例肯定能放进这个数组),再强转成T[]来适配heap的类型声明。
虽然这个强转会触发"未检查的强制转换"警告,但在这个场景下是安全的——因为整个ArrayHeap的逻辑里,只会往heap数组中存放T类型的对象,不会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Александр Скворцов
相关产品推荐
相关产品推荐

