Да, это возможно.
Как правило, если свойство выражается с помощью аннотации, вам необходимо использовать процессор аннотаций.
Вот полный пример того, что использует Checker Framework .
Файл SO61029446.java
:
public class SO61029446 {
void someMethod(Class<? extends @MyAnnotation Object> klass) {}
void client() {
someMethod(Foo.class); // Must work
someMethod(Bar.class); // Compiler error
}
}
@MyAnnotation
@SuppressWarnings("subtyping")
class Foo {}
class Bar {}
Файл MyAnnotation.java
:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf(UnknownMyAnnotation.class)
@interface MyAnnotation {}
@DefaultQualifierInHierarchy
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf({})
@interface UnknownMyAnnotation {}
Теперь запустите эти команды (после установки Checker Framework):
javacheck MyAnnotation.java
javacheck -g SO61029446.java -processor org.checkerframework.common.subtyping.SubtypingChecker -Aquals=MyAnnotation,UnknownMyAnnotation SO61029446.java
Вывод второй команды:
SO61029446.java:11: error: [argument.type.incompatible] incompatible types in argument.
someMethod(Bar.class); // Compiler error
^
found : @UnknownMyAnnotation Class<@UnknownMyAnnotation Bar>
required: @UnknownMyAnnotation Class<? extends @MyAnnotation Object>
Компилятор пожаловался на недопустимый вызов, но разрешил законный вызов, просто как вы просили.
Несколько замечаний:
- Команда
javacheck
такая же, как описано в Checker Framework Manual . - Там являются двумя
javacheck
командами, потому что первая делает аннотации доступными для пути к классам для второй. - Аннотация
@SuppressWarnings("subtyping")
к классу Foo
может не потребоваться в зависимости от вашего фактического кода. (Это игрушечный пример.) - Ответ Слоу начинается с первого предложения «Нет, это невозможно.», Что является неверным . Другой подход Слава к решению проблемы без аннотаций не является плохим (в некоторых отношениях это лучше, потому что он использует только компилятор Java без какого-либо дополнительного инструмента), но он не отвечает на этот вопрос об использовании аннотаций.