我看到了一些代码,我试图理解它。在下面的代码中,一个接口扩展了一个注解。我不明白为什么这是可能的。让接口扩展注释有什么意义?如何使用扩展注解的接口?谢谢!
public interface TheScope extends javax.inject.Scope {
...
}
public ScopeClazz implements TheScope {
...
}
我看到了一些代码,我试图理解它。在下面的代码中,一个接口扩展了一个注解。我不明白为什么这是可能的。让接口扩展注释有什么意义?如何使用扩展注解的接口?谢谢!
public interface TheScope extends javax.inject.Scope {
...
}
public ScopeClazz implements TheScope {
...
}
根据 Java注释类型规范:
除非在此明确修改,否则适用于普通接口声明的所有规则都适用于注释类型声明。
例如,注解类型与普通类和接口类型共享相同的命名空间;和注解类型声明在接口声明合法的地方都是合法的,并且具有相同的范围和可访问性。
因此,您可以像实现接口一样实现注释类型。唯一的区别是你不能用另一个注解来扩展一个注解。
javax.inject.Scope 也是一个接口(还有什么?!)见http://docs.oracle.com/javaee/6/api/javax/inject/Scope.html
除了可用作注解之外,注解类型也是普通接口。这在运行时读取注解时很有用,因为注解可以表示为注解类型的实例。
作为这种实现选择的副作用,您可以像任何其他接口一样扩展或实现它们。这完全独立于使用这种类型作为注解。由于这意味着同一类型将用于两种不同的事物(作为注释类型和普通接口),因此这种用法可能会违反关注点分离,并且不常见。但是,从语言的角度来看,语义清晰且不危险,因此几乎没有理由要求编译器防止这种极端情况的发生。