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

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


加油!:)

0
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1705 问题

查看课程