Атрибут аннотации должен быть литералом класса? Почему? Константы тоже подойдут

Может кто-нибудь объяснить, почему параметры аннотации String и Class ожидаются по-разному? Почему компилятору требуются литералы для классов, которые также принимают константы для строк?

Рабочий пример с Spring @RequestMapping:

public class MyController {
    public static final String REQUEST_MAPPING = "/index.html";
    @RequestMapping(MyController.REQUEST_MAPPING) // ALL OK!
    ...
}

Пример WTF с TestNG @Test:

public class MyControllerTest {
    public static final Class TEST_EXCEPTION = RuntimeException.class;
    @Test(expectedExceptions = MyControllerTest.TEST_EXCEPTION) // compilation error, WTF:
    // The value for annotation attribute Test.expectedExceptions must be a class literal
    ...
}

Конечно, работает @Test (expectedExceptions = RuntimeException.class). Но почему? Единственное отличие параметра аннотации, которое я вижу, - это его тип: String vs Class. Почему компилятор Java также принимает константу String, но принимает только литералы класса?

10
задан JasonMArcher 21 October 2014 в 21:09
поделиться