关于内部类调用局部变量的问题
来源:8-8 Java中的PriorityQueue
慕田峪7180023
2018-07-18
老师,我使用匿名内部类的方式将构造器传入优先队列时,构造器内部调用了函数的局部变量map,在eclipse中将会报错Cannot refer to a non-final variable * inside an inner class defined in a different method.需要在局部变量中加final修饰方可以消除错误,但是不加final修饰在LeetCode中却也可以通过,想请问老师是怎么回事?
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return map.get(a) - map.get(b);
}
});
还有一个问题,就是我将老师的源码复制到eclipse中,传入构造器那一行也会报错,Cannot infer type arguments for PriorityQueue<>,我检查了一下,我确实是导入了Comparator包,但是编译一直报错,在LeetCode中却也可以通过,我想请问是eclipse的问题吗?还是因为java的版本太低,不支持这种构造? 谢谢老师
1回答
-
liuyubobobo
2018-07-19
我认为是Java版本太低。这个课程的Java代码是基于Java8或者以上版本的。
你说的第一个问题,是一个典型的闭包捕获的问题,在Java8中,对闭包进行了重大更新和增强。
你说的第二个问题,我查了一下,Java7的PriorityQueue还不支持直接传一个Comparator的对象进行构造的。在Java8中添加了这个方法。
Java8的文档:https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html 课程中使用的是第三个构造函数的方法。
在Java7中,传Comparator构造PriorityQueue,在之前还需要传一个initialCapacity,可以参考Java7 Priority Queue文档中,第四个构造函数:https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
个人建议,现在做Java开发或者Java学习,至少用Java8,这也是这个课程使用Java8的原因,虽然Java已经出Java10了:)
至于IDE,强烈建议给JetBrains家的IntelliJ IDEA一个机会。免费的哦:)我了解Eclipse曾经在Java IDE上一统江山。但是时代变了。诺基亚回倒,不是因为诺基亚变差了,是因为苹果真的更好用。同理,IntelliJ IDEA真的更好用:)当然,只是个人建议:)
加油!:)
00
相似问题