【发布时间】:2011-06-20 20:49:07
【问题描述】:
工作中的一个同伴扩展了 LinkedHashMap,并覆盖了removeEldestEntry,类似于:
import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class CompileTest {
static class MyMap<K, V> extends LinkedHashMap<K, V> {
protected boolean removeEldestEntry(Entry<K, V> eldest) {
return true;
}
}
}
注意参数类是Entry,而不是Map.Entry。
Eclipse 生成了方法签名。 IntelliJ 显示错误,抱怨 Entry 在 java.util.LinkedHashMap 中具有私有访问权限,并且更喜欢 Map.Entry。但它仍然可以编译。
我写了一个小例子来做实验:
public class CompileTest {
static class A{
public class Inner {
}
public void doStuff(Inner a){}
}
static class B extends A{
private class Inner {
}
}
static class C extends B {
public void doStuff(Inner a) { }
}
}
现在 IntelliJ 不显示错误,但类无法编译。以下是两种看起来相同的情况,IDE 和编译器似乎在交替行为,而且彼此之间也从来没有达成一致。
谁能解释一下?
【问题讨论】:
-
编译器始终是 正确 参考...而且您的示例与
Entry与Map.Entry的做法不同,后者是 @ 的内部类987654331@制作Entry和Map的内部类 -
这两个例子的静态导入有区别吗?
-
他们看起来一样吗?您的测试用例中的
import语句在哪里?导入有效地建立了别名,以消除给定非限定名称引用的完全限定名称的歧义。你的测试用例没有。 -
+1 给贾罗德。您的示例并未反映您最初在问题中陈述的范围界定问题。一方面,您的内部类定义太深了,并且您还在 B 类中将 Inner 类声明为私有类,从而有效地将其隐藏在 C 类中。这就是您的编译错误的根源。
-
顺便说一下,这个错误在 Eclipse 中。它生成的代码完全是错误的。使用 Eclipse 生成的代码,HashMap.Entry 优先于 Map.Entry。