【问题标题】:Java generics parameters with base of the generic parameter具有泛型参数基础的 Java 泛型参数
【发布时间】:2010-03-26 09:32:10
【问题描述】:

我想知道在 Java 中是否有一个优雅的解决方案(除了明显的 - 声明不同/显式函数。这是代码:

private static HashMap<String, Integer> nameStringIndexMap 
        = new HashMap<String, Integer>();
private static HashMap<Buffer, Integer> nameBufferIndexMap 
        = new HashMap<Buffer, Integer>();

// and a function
private static String newName(Object object, 
        HashMap<Object, Integer> nameIndexMap){
    ....
}

问题是我无法将 nameStringIndexMapnameBufferIndexMap 参数传递给函数。除了执行另一个明确需要 HashMapHashMap 参数的函数之外,我没有关于更优雅的解决方案的想法。

我的问题是: 这可以用更优雅的解决方案/使用泛型或类似的东西来实现吗?

谢谢,

尤利安

【问题讨论】:

  • 我不明白你的目标是什么。你想为 Buffers 复制你的 newName 方法吗?
  • 我想对这两种类型使用相同的功能。这就是我想要达到的目标。下面有一些答案可以帮助我做到这一点

标签: java generics inheritance


【解决方案1】:

你也可以让你的函数通用:

private static <E extends Object> String newName(E object, 
        HashMap<E, Integer> nameIndexMap){
    ....
}

这将函数的两个参数绑定在一起,因此对于HashMap&lt;String, Integer&gt;,您只能将String 实例作为第一个参数传递。这可能是也可能不是您真正想要的:如果您只想从地图中获取元素,Jon 的解决方案更简单,但如果您想将此对象添加到地图中,则此选项是唯一的选择。

【讨论】:

  • 这正是我想要的。非常感谢
【解决方案2】:

你想要这样的东西:

private static String newName(Object object, 
        HashMap<? extends Object, Integer> nameIndexMap) {
    ....
}

或(如 cmets 中所指出的)

private static String newName(Object object, 
        HashMap<?, Integer> nameIndexMap) {
    ....
}

这将阻止您将任何东西 放入 地图,因为您无法保证获得正确的密钥 - 但您可以将东西 从地图中取出并保证它们是整数。

请注意,此版本不会使方法成为通用方法 - 这意味着它更简单,但它提供与 Peter 版本相同的类型安全性,因为您无法保证object 是正确的类型。每种方法都有其优点和缺点 - 根据方法的主体使用最合适的方法。 (如果你需要在地图中放一个条目,彼得的方法肯定更好。)

【讨论】:

  • @newacct:是的。我会补充的。
  • 这是一个很好的答案,但符合我目的的答案不是这个。还是谢谢你的回答
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 2022-01-04
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多