Может кто-нибудь объяснить, почему параметры аннотации 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, но принимает только литералы класса?