静态内部类需要导入注释

时间:2011-01-26 01:12:17

标签: 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{

   }
}

现在当编译器踢它时,它会说 TestClassOne无法解析为类型。有一种简单的方法可以解决这个问题。例如,它需要对静态类进行明确的导入。

import foo.TestSuite.TestClassOne; 
import foo.TestSuite.TestClassTwo; 

我的问题是,任何人都可以解释一下编译规则或原因可能会使注释无法看到类静态内部类。请记住,包私有类很好,并且无需导入即可编译。

3 个答案:

答案 0 :(得分:5)

您不需要导入内部类,您可以使用

访问它们
TestSuite.TestClassOne

详细信息可以在JLS中找到,但我的简单规则是:导入a.b.c.d.e允许您使用e而不是完全限定名称。它不允许您使用f

答案 1 :(得分:5)

这是一个有趣的问题。根据[1],名称“TestClassOne”的范围是“整个”类“TestSuite”。

中的注释是“ TestSuite的主体吗?显然不是。但那不是很公平。范围规则是在引入注释之前定义的。如果在类的范围内考虑类注释,我没有看到任何问题。无论如何,他们非常亲密。

另一个问题是如何在注释中引用简单名称“TestSuite”?事实证明,规范涵盖了这个。注释是一个修饰符,它是类型声明的一部分,“顶级类型的范围是包中的所有类型声明”。

然而,规范有可能是偶然的。规则是在引入注释之前定义的,之后保持不变。因此虽然它涵盖了技术性案例,但它可能是一个意外。这并不怀疑语言设计师的脑力 - 整个规范太复杂了。

[1] http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.3

答案 2 :(得分:2)

只是一个额外的信息:不仅在使用注释时,还需要在将其用作参数类型时导入内部类,这非常烦人。