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