因此,我正在进行一些 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{
}
}
现在,当编译器启动它时,它会说 TestClassOne 无法解析为类型。 有一个简单的方法可以解决这个问题。 例如,它需要显式导入静态类。
import foo.TestSuite.TestClassOne;
import foo.TestSuite.TestClassTwo;
我的问题是,谁能解释一下注释可能无法看到类静态内部类的编译器规则或原因。 请记住,包私有类看起来很好并且无需导入即可编译。
这是一个有趣的事情。根据[1],名称“TestClassOne”的范围是“整个主体”类“TestSuite”。
注释是在“body of” TestSuite 中吗?显然不是。但这不太公平。范围规则是在引入注释之前定义的。如果在类的范围内考虑类注释,我没有看到任何问题。反正他们很亲密。
另一个问题是为什么注释中可以引用简单的名称“TestSuite”?事实证明规范涵盖了这一点。注解是一个修饰符,它是类型声明的一部分,“顶级类型的范围是包中的所有类型声明”。
但是,规范也可能是偶然正确的。规则在引入注释之前定义,并且在引入注释之后保持不变。因此,虽然它在技术上涵盖了这个案例,但这可能是一个意外。这并不是要怀疑语言设计者的脑力——整个规范实在是太复杂了。
[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3
您不需要导入内部类,您可以使用访问它们
TestSuite.TestClassOne
详细信息可以在 JLS 中找到,但我的简单规则是:导入
a.b.c.d.e
允许您使用 e
而不是完全限定名称。它不允许您使用 f
。
补充一点:不仅在使用注解时需要导入内部类,而且在使用它作为参数类型时也需要导入内部类,这很烦人。