在遍历map的时候使用entrySet(是一个EntrySet类型的对象,此类是HashMap的一个内部类)生成Iterator类对象i1。需要进行一次向下转型,因为Node是一个HashMap访问控制权限为默认的静态内部类,所以不能转成HashMap.Node。
Set set1 = map.entrySet();
Iterator i1 = set1.iterator();
while (i1.hasNext()) {
// HashMap.Node hn = (HashMap.Node) i1.next();
// 'java.util.HashMap.Node' is not public in 'java.util.HashMap'.
// Cannot be accessed from outside package
// Map.Entry me = (Map.Entry)i1.next();
Map.Entry me = (Map.Entry)i1.next();
// 从此可以看出.的优先级比小括号高?
System.out.println(me.getKey() + "-" + me.getValue());
所以需要向下转型成Map.Entry。
因为接口的访问权限和类一样,只有public和默认。我看了Map的源码,Map是public,但是它内部的Entry接口是不带public的,所以有一个困惑,为什么这个默认的Entry能在包外使用?按理说应该要和上面内部类的报错一致才对。
后来进行尝试,其实接口里面定义的接口如果不带public,那么其实它的访问权限就是public,而不是普通的默认。
这一点从如下提示的public对于此接口成员是多余的可以证实。
public interface AAAAA {
public int a =10;
public interface AAAAAAA{
//Modifier 'public' is redundant for interface members
}
}