具有泛型参数基础的Java泛型参数

时间:2010-03-26 09:32:11

标签: java generics inheritance

我想知道在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){
    ....
}

问题是我无法将 nameStringIndexMap nameBufferIndexMap 参数传递给该函数。除了做另一个明确需要 HashMap&lt; String,Integer&gt; HashMap&lt; Buffer,Integer&gt; 参数的函数之外,我不知道更优雅的解决方案。< / p>

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

谢谢,

尤利安

2 个答案:

答案 0 :(得分:4)

你也可以使你的功能变得通用:

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

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

答案 1 :(得分:3)

你想要这样的东西:

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

或(如评论中所指出的)

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

这会阻止你将任何放入地图,因为你不能保证得到正确的键 - 但是你可以得到地图的 out 保证他们会成为整数。

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