请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于内部类调用局部变量的问题

老师,我使用匿名内部类的方式将构造器传入优先队列时,构造器内部调用了函数的局部变量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的版本太低,不支持这种构造? 谢谢老师

正在回答 回答被采纳积分+3

1回答

liuyubobobo 2018-07-19 10:47:52

我认为是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真的更好用:)当然,只是个人建议:)


加油!:)

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号