首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带注解的泛型由注解注解

带注解的泛型由注解注解
EN

Stack Overflow用户
提问于 2015-01-23 06:33:50
回答 2查看 1.1K关注 0票数 1

我正在尝试这样做,我有一些"base“注释

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface A
{

}

我有注解B,注解为A

代码语言:javascript
复制
@A
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface B {

    String value();
}

我希望接口的行为类似于这样,确保T是由A注释的注解。

代码语言:javascript
复制
interface SomeInterface<T extends A>
{
    void method(T argument);
}

所以我实现了像这样的东西

代码语言:javascript
复制
public class Implementation implements SomeInterface<B>
{
    public void method(B argument);
}

如何做到这一点?当我在SomeInterface中使用"T扩展A“时,当我实现它时,它告诉我B不是一个有效的替代品。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-01-23 06:41:08

B不是<T extends A>的有效替代,因为B不扩展A

Java不包含要求泛型类型参数具有特定注释的方法。

如果您可以将SomeInterface重构为类而不是接口,则可以在构造函数中放置运行时检查:

代码语言:javascript
复制
protected SomeInterface(Class<T> classOfT) {
    if(classOfT.getAnnotation(A.class) == null)
        throw new RuntimeException("T must be annotated with @A");
}
票数 3
EN

Stack Overflow用户

发布于 2015-01-23 06:41:50

注解继承在Java中是不可能的。

您所编写的只是一个由另一个批注批注的批注,而不是扩展另一个批注的批注。

如果注释继承是可能的,我猜应该是这样的:

代码语言:javascript
复制
public @interface B extends A {

    String value();
}

但它就是不存在。

还要检查此link和此link

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28099877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档