为何Java中用int[]初始化PriorityQueue可编译?疑违反泛型限制
泛型中使用
int[]为何能正常编译? 你提到的这段代码里,PriorityQueue<int[]>并没有违反Java泛型不能用基本类型的限制,原因很简单:int[]不是基本数据类型,而是数组引用类型。
先看你给出的代码:
public int[] topKFrequent(int[] nums, int k) { PriorityQueue<int[]> priorityQueue = new PriorityQueue<>( (a, b) -> a[1] == b[1] ? b[0] - a[0] : b[1] - a[1]); int[] arr = new int[20001]; for (int num : nums) arr[num + 10000]++; for (int i = 0; i < 20001; i++) if (arr[i] != 0) priorityQueue.add(new int[]{i - 10000, arr[i]}); int length = Math.min(priorityQueue.size(), k); int[] result = new int[length]; for (int i = 0; i < length; i++) result[i] = priorityQueue.poll()[0]; return result; }
Java泛型禁止的是用基本数据类型(比如int、char、boolean这类)直接实例化泛型类,比如你写PriorityQueue<int>才会编译报错。但数组不一样:不管数组里存的是基本类型还是引用类型,数组本身都是Object的子类,属于引用类型范畴。int[]本质上是一个指向int数组对象的引用,完全符合泛型对类型参数必须是引用类型的要求,所以这段代码在Java 8(以及所有支持泛型的Java版本)里都能正常编译运行。
内容的提问来源于stack exchange,提问作者Omar Shawky
相关产品推荐
相关产品推荐

