Как вы гарантируете, что параметр аннотации класса расширяет интерфейс во время компиляции? - PullRequest
0 голосов
/ 30 марта 2012

У меня есть аннотация, которую я пытаюсь определить, которая принимает параметр Class. Я хотел бы убедиться, что предоставленный класс расширяет определенный интерфейс. Итак, я придумал ...

public @interface Tag {
    Class<? extends ITagStyle> style() default NoStyle.class
}
public class NoStyle implements ITagStyle {
    ...
}

Однако я получаю ошибку компиляции "несовместимых типов".

Я предполагаю, что это потому, что NoStyle.class возвращает Class вместо Class<NoStyle>. В JLS для Java SE 5 & 7 (не удалось найти 6, я использую 6) конкретно говорится, что "void.class" вернет "Class". СМ. Литералы класса JLS: http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.8.2

Есть ли способ сделать это во время компиляции? Если нет, то я предполагаю, что обходной путь должен проверять значение стиля во время выполнения, чтобы убедиться, что оно расширяет ITagStyle: '(

РЕШЕНИЕ: В JDeveloper есть ошибка в компиляторе "в процессе". Проверка "вне процесса" или использование JDK7u3 исправляет ошибку компиляции.

1 Ответ

0 голосов
/ 30 марта 2012

Это работает, поэтому вы либо упускаете что-то очевидное, либо ваша ошибка не связана с тем, что вы нам показываете:

public class Test {

    public interface ITagStyle {
    }

    public @interface Tag {
        Class<? extends ITagStyle> style() default NoStyle.class;
    }

    public class NoStyle implements ITagStyle {
    }

    public class SomeStyle implements ITagStyle {

    }

    @Tag(style = SomeStyle.class)
    public static void main(String[] args) {

    }
}

Это было проверено на JDK 1.6.0_26

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...