Статические внутренние классы нуждаются в импорте для аннотаций - PullRequest
5 голосов
/ 26 января 2011

Итак, я проводил некоторое тестирование 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 ]

5 голосов
/ 26 января 2011

Это интересный. Согласно [1] область действия имени «TestClassOne» составляет «все тело» класса «TestSuite».

Является ли аннотация в "телом" TestSuite? Очевидно нет. Но это не очень справедливо. Правило области было определено до введения аннотации. Я не вижу никаких проблем, если аннотация класса рассматривается в области видимости класса. Они все равно очень близки.

Другой вопрос, почему простое имя «TestSuite» может упоминаться в аннотации? Оказывается, спецификация покрывает это. Аннотация - это модификатор, который является частью объявления типа, и «область действия типа верхнего уровня - это все объявления типов в пакете».

Однако вполне возможно, что спецификация поняла это случайно. Правила были определены до введения аннотации и остаются неизменными после. Таким образом, хотя это касается случая с технической точки зрения, это может быть случайностью. Это не вызывает сомнений в умственных способностях разработчиков языков - вся спецификация просто чертовски сложна.

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

5 голосов
/ 26 января 2011

Вам не нужно импортировать внутренний класс, вы можете получить к ним доступ, используя

TestSuite.TestClassOne

Подробности можно найти в JLS , но мое простое правило: импорт a.b.c.d.e позволяет использовать e вместо полностью определенного имени. Это не позволяет вам использовать f.

2 голосов
/ 04 марта 2011

Просто дополнительная информация: необходимо импортировать внутренние классы не только при использовании аннотаций, но и при использовании его в качестве параметрического типа, что очень раздражает.

...