【问题标题】:Map to Class that Implements Interface映射到实现接口的类
【发布时间】:2016-12-02 15:18:14
【问题描述】:

我现在有

class A {...}
interface B {...}

我想要的是一些等价的

HashMap<String, A implements B>

即,String 映射到任何实现 BA 实例。但是该语法无法编译。有没有办法映射到实现接口的类?另请注意,A 不是通用的,所以我不能做类似的事情

A<? implements B>

【问题讨论】:

  • 你的意思是任何实现BA 的子类?
  • 这闻起来像代码味道。你确定你的类层次设计是正确的吗?
  • @NicolasFilotto 完全正确
  • @biziclop 你能确定吗:)。但说真的,这似乎是一个正常的用例。如果我可以声明一个实现接口的子类,为什么我不能映射到其中之一?
  • 你可以只映射到接口而不用担心它是什么类。如果你必须同时担心这两个问题,那么肯定会发生一些奇怪的事情。 (就像在TreeSet 中一样,合同让事情变得很尴尬,您要么需要Comparable 的元素,要么提供Comparator。)或者,您可以创建扩展B 的接口C,并且还包含从A 获取您需要的所有方法,并使A 的子类实现C 而不是B

标签: java generics hashmap wildcard


【解决方案1】:

可以在泛型上下文中完成,例如,在泛型方法中:

public <T extends A & B> void method() {
    Map<String, T> map = new HashMap<>();
}

很遗憾,我们无法将这些多重限制应用于通配符。

【讨论】:

  • 这看起来很有趣,但是我在一个已经有返回值的方法中声明了这个 Map,所以我无法从签名中得到这个参数化。从技术上讲,我可以将其重构为一些奇怪的 getHashMap() 方法,该方法仅返回基于签名的参数化映射,但这似乎很hacky。
  • @Sherz,这里的返回类型无关紧要,可以像this.&lt;C&gt;method() 一样调用该方法,其中Cclass C extends A implements B
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多