Joh*_*int 5 java compiler-construction annotations inner-classes
所以我正在进行一些jUnit测试,并希望编写具有类似功能但又足够小以在单个类中编写的不同类.无论设计决定如何,它都会给我带来编译错误,我不确定我看到的规则是什么.
你可以想象它看起来像
package foo;
@RunWith(Suite.class)
@SuiteClasses({ TestClassOne.class, TestClassTwo.class })
public class TestSuite{
@RunWith(SpringJUnit4ClassRunner.class)
public static class TestClassOne{
}
@RunWith(SpringJUnit4ClassRunner.class)
public static class TestClassTwo{
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当编译器踢它时,它会说TestClassOne无法解析为一个类型.有一种简单的方法可以解决这个问题.例如,它需要对静态类进行明确的导入.
import foo.TestSuite.TestClassOne;
import foo.TestSuite.TestClassTwo;
Run Code Online (Sandbox Code Playgroud)
我的问题是,任何人都可以解释一下编译器规则或原因可能会使注释无法看到类静态内部类.请记住,包私有类很好,并且无需导入即可编译.
您不需要导入内部类,您可以使用它来访问它们
TestSuite.TestClassOne
Run Code Online (Sandbox Code Playgroud)
详细信息可以在JLS中找到,但我的简单规则是:导入a.b.c.d.e
允许您使用e
而不是完全限定名称.它不允许你使用f
.
这是一个有趣的.根据[1],名称"TestClassOne"的范围是"整个"类"TestSuite".
TestSuite的"正文"中是否有注释?显然不是.但那不是很公平.范围规则是在引入注释之前定义的.如果在类的范围内考虑类注释,我没有看到任何问题.无论如何,他们非常亲密.
另一个问题是如何在注释中引用简单名称"TestSuite"?事实证明,规范涵盖了这个.注释是一个修饰符,它是类型声明的一部分,"顶级类型的范围是包中的所有类型声明 ".
然而,规范有可能是偶然的.规则是在引入注释之前定义的,之后保持不变.因此虽然它涵盖了技术性案例,但它可能是一个意外.这并不怀疑语言设计师的大脑能力 - 整个规范太复杂了.
[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3