【问题标题】:Can I use annotation as a key in a HashMap?我可以使用注释作为 HashMap 中的键吗?
【发布时间】:2014-06-16 13:38:39
【问题描述】:

例如,我有一个通过反射得到的字段。该字段上有注释。我用

field.getAnnotation(CustomAnnotation.class)

得到一个。我可以将它用作哈希映射中的键吗?我的意思是我可以,但是这个键对于字段来说是唯一的吗?


我想要HashMap<CustomAnnotation, Integer>,其中整数值是 CustomAnnotation 具有的集合中最后使用的元素的索引:

@CustomAnnotation(values={"ONE", "TWO"})

【问题讨论】:

  • 您不想使用字段作为键(并将注释作为值)吗?
  • 是的,它将是唯一的,因为您不能在一个字段上指定多个相同类型的注释。
  • @IvanBabanin:但是您可以在其他字段上指定相同的注释,并可能为它们取回相同的对象。那么这不能用作键。
  • 也许你先试试?我想,只要注释的 hashCode() 没有以某种意想不到的方式实现,它就应该是。

标签: java reflection


【解决方案1】:

您可以使用 Annotation 实例作为 HashMap 键。 interface defines exactly equals 和 hashCode 应该如何工作。本质上它们是平等的......

...如果指定的对象表示一个在逻辑上等价于这个的注解。

但是,我不确定这是您想要的。

特别是,如果您在两个不同的字段中有相同的@CustomAnnotation(x=123),则只有其中一个可以进入地图。

您不想键入字段并取回注释吗?

FWIW、字段(以及类和方法)都可以用作键,具有“良好的语义”(如果引用同一个对象,则视为相等)。

【讨论】:

  • 特别是,如果您在两个不同的字段上有相同的@CustomAnnotation(x=123),则只有其中一个可以进入地图。 -- 所以如果我在不同的字段上有第二类注释,它们会产生相似的键,对吧?
  • @ZuzEL 如果它们具有相同的“x”字段,它们将产生相似的键:@CustomAnnotation(x=123) != @CustomAnnotation(x=124)
  • 是的,相同(“equal”)注解对象(“key”),用于两个具有相同内容的注解。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2016-11-17
  • 2020-12-20
  • 2011-11-13
  • 2015-03-05
相关资源
最近更新 更多