pha*_*99w 6 java compiler-construction static inner-classes
这是一个非常复杂的错误,所以请耐心等待.
我在尝试编译一些Java代码时看到了一个奇怪的错误.编译器无法识别静态内部类.让我们说我正在上课MyClass.我需要使用的静态内部类具有FQN x.y.z.Parent.DesiredClass.使用其FQN显式导入此内部类.父级也使用其FQN导入.现在存在另一个包含(另一个,不同的FQN)的包,它有一个类DesiredClass.此其他DesiredClass位于类路径中,但未显式导入.
在继续之前,我应该明确表示无法更改这些类的名称.
现在,当我引用Parent.DesiredClass在我的代码,我使用FQN的Parent.DesiredClass,以避免任何可能的歧义.但是当我编译时,我尝试实例化时遇到错误Parent.DesiredClass.我的代码片段:
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Run Code Online (Sandbox Code Playgroud)
这会产生以下编译时错误:
MyClass.java:123: an enclosing instance that contains x.y.z.Parent.DesiredClass is required
dc = new x.y.z.Parent.DesiredClass();
^
Run Code Online (Sandbox Code Playgroud)
值得注意的是,链接的类是使用不同的Java编译器编译的:
MyClass 旨在使用Sun Java 1.4.2_18进行编译x.y.z.Parent.DesiredClass与其他 DesiredClass使用编译微软的Java.遗憾的是,再次使用更现代的Java版本无法重新编译这些类.
此外,当实际尝试使用Sun Java 1.4.2_18进行编译时,编译器中会发生以下异常:
An exception has occurred in the compiler (1.4.2_18). Please file a bug at the Java Developer Connection (http://java.sun.com/cgi-bin/bugreport.cgi) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.NullPointerException
at com.sun.tools.javac.v8.code.Type.isSubTypes(Type.java:557)
at com.sun.tools.javac.v8.comp.Resolve.instantiate(Resolve.java:221)
at com.sun.tools.javac.v8.comp.Resolve.selectBest(Resolve.java:317)
at com.sun.tools.javac.v8.comp.Resolve.findMethod(Resolve.java:414)
...
at com.sun.tools.javac.v8.comp.Attr.attribClass(Attr.java:1332)
at com.sun.tools.javac.v8.JavaCompiler.compile(JavaCompiler.java:355)
at com.sun.tools.javac.v8.Main.compile(Main.java:569)
at com.sun.tools.javac.Main.compile(Main.java:36)
at com.sun.tools.javac.Main.main(Main.java:27)
Error encountered running Java Compiler
Aborting compilation.
Run Code Online (Sandbox Code Playgroud)
如果我使用较新版本的Java(1.5以上版本)进行编译,则不会发生编译器异常,但仍会出现上述错误.
任何人都可以解释这个错误?为什么编译器不将静态内部类识别为静态,即使它是使用其FQN引用的?
对你的帮助表示感谢.
==========
编辑:兔子洞加深.经过进一步调查后,我发现问题是由我需要在其中一个库中的一行代码触发的.我可以访问该库的源代码,但不要将其编译为我的项目的一部分.代码行(让我们说它在课堂上TheirClass)完全符合我的要求; 即,实例化x.y.z.DesiredClass.如果我在TheirClass(但不是MyClass)中删除这行代码,那么我不会得到编译错误.
因此,总之,以下不起作用:
MyClass.java:
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Run Code Online (Sandbox Code Playgroud)
他们的Class.java:
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Run Code Online (Sandbox Code Playgroud)
下面做工作:
MyClass.java:
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Run Code Online (Sandbox Code Playgroud)
他们的Class.java:
//x.y.z.Parent.DesiredClass dc;
//dc = new x.y.z.Parent.DesiredClass();
Run Code Online (Sandbox Code Playgroud)
我将尝试遵循@ Richard的建议并最小化代码,以便我可以发布它的样本.
虽然仍然忙于进行 @Richard 和 @Stephen 建议的低级调查,但我对这个问题有一些想法。
我首先尝试DesiredClass使用一个名称不那么模糊的类进行扩展,然后看看如果我宁愿使用扩展类,它是否会起作用。它没有并导致同样的错误。
然后我尝试DesiredClass使用以下方法实例化Class.forName():
DesiredClass dc;
try {
dc = (DesiredClass) Class.forName(classname).newInstance();
}
catch (Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
这有效!
尽管这有点混乱,但它让我可以继续我的工作。我很想知道错误的根本原因是什么(也许编译器使用的类加载器有一些问题,特别是考虑到有些类是用不同“品牌”的编译器编译的?),但是成本 -花更多时间试图解决这个问题的好处是不值得的。
感谢所有做出贡献的人。
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |