【发布时间】:2009-10-21 23:07:58
【问题描述】:
eclipse编译器拒绝编译以下代码,说明字段s不可见。 (IBM 的 Aspect J 编译器也拒绝了,说“s 无法解析”)这是为什么呢?
public class Test {
String s;
void foo(Object o) {
String os = getClass().cast(o).s;
}
}
Java 语言规范规定:
否则,我们说有默认值 访问,只有在 访问发生在 声明类型的包。
按照我的理解,该字段是在同一个编译单元中声明和访问的,因此在同一个包中,因此应该是可访问的。
更奇怪的是,添加从? extends Test 到Test 的向下转换使该字段可见,即以下代码编译:
public class Test {
String s;
void foo(Object o) {
Test t = getClass().cast(o);
String os = t.s;
}
}
我是否偶然发现了编译器错误,或者误解了 Java 规范?
编辑: 我现在在另一台电脑上。在这里,javac 接受代码,但 eclipse 仍然不接受。本机版本:
Eclipse 平台
版本:3.4.2 版本号: M20090211-1700
JDK 1.6.0
编辑 2 事实上,javac 接受代码。我通过运行使用 IBM 的 Ascpect J 编译器的 ant 构建进行了测试...
【问题讨论】:
-
kewl 问题。乔什·布洛赫在哪里?
标签: java generics compiler-construction compiler-errors