我不明白为什么Java注释中没有继承,就像Java类一样。我认为这会很有用。
例如:我想知道一个给定的注释是否是一个验证器。通过继承,我可以反射性地在超类中导航,以了解这个注释是否扩展了ValidatorAnnotation。否则,我怎么才能做到这一点呢?
那么,谁能给我一个这个设计决定的理由呢?
我不明白为什么Java注释中没有继承,就像Java类一样。我认为这会很有用。
例如:我想知道一个给定的注释是否是一个验证器。通过继承,我可以反射性地在超类中导航,以了解这个注释是否扩展了ValidatorAnnotation。否则,我怎么才能做到这一点呢?
那么,谁能给我一个这个设计决定的理由呢?
当前回答
在某种意义上,你已经有了它的注释-元注释。如果您用元信息注释注释,这在许多方面等同于扩展一个额外的接口。注释是接口,因此多态性并没有真正发挥作用,而且由于它们本质上是静态的,因此不可能存在运行时动态调度。
在验证器示例中,您可以只在注释上获得带注释的类型,并查看它是否具有验证器元注释。
我所能看到的继承将会有所帮助的唯一用例是,如果您希望能够通过超级类型获得注释,但这将增加一大堆复杂性,因为给定的方法或类型可能有两个这样的注释,这意味着必须返回一个数组,而不仅仅是一个对象。
因此,我认为最终的答案是用例是深奥的,并且使更多的标准用例复杂化,因此不值得这样做。
其他回答
从没想过这个,但是…看来你是对的,注释继承设施没有问题(至少我没有看到它的问题)。
关于你用“验证器”注释的例子-你可以利用“元注释”方法。例如,您将特定的元注释应用到整个注释接口。
我能想到的一件事是有多个注释的可能性。因此,您可以在同一位置添加验证器和更特定的注释。但我可能错了:)
Java注释支持的设计者做了许多不利于Java社区的“简化”。
没有注释子类型会使许多复杂的注释变得不必要地丑陋。注释中不能简单地有一个属性,该属性只能包含以下三种内容之一。一个需要有三个独立的属性,这使开发人员感到困惑,并且需要运行时验证以确保只使用三个属性中的一个。 每个站点只能有一个给定类型的注释。这导致了完全不必要的集合注释模式。@Validation和@Validations, @Image和@Images等等。
第二个问题已经在Java 8中得到了解决,但为时已晚。许多框架都是基于Java 5中可能实现的功能编写的,现在这些API的缺陷将会存在很长一段时间。
和我有同样的问题。不,你不能。我确实“自律”自己在注释中写属性,以尊重一些标准,所以当你得到注释时,你可以通过它的属性“嗅”出它是什么类型的注释。
在某种意义上,你已经有了它的注释-元注释。如果您用元信息注释注释,这在许多方面等同于扩展一个额外的接口。注释是接口,因此多态性并没有真正发挥作用,而且由于它们本质上是静态的,因此不可能存在运行时动态调度。
在验证器示例中,您可以只在注释上获得带注释的类型,并查看它是否具有验证器元注释。
我所能看到的继承将会有所帮助的唯一用例是,如果您希望能够通过超级类型获得注释,但这将增加一大堆复杂性,因为给定的方法或类型可能有两个这样的注释,这意味着必须返回一个数组,而不仅仅是一个对象。
因此,我认为最终的答案是用例是深奥的,并且使更多的标准用例复杂化,因此不值得这样做。