2010-03-26 320 views
3

我想知道是否有在Java中这样做(除了明显的一个优雅的解决方案的基础 - 声明不同的/显函数的下面是代码: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参数的功能。我没有这样做,其中明确想要一个的HashMap <字符串另一功能旁边一个更优雅的解决方案的想法,整数>HashMap < Buffer,Integer >参数。

我的问题是: 这可以在一个更优雅的解决方案/使用泛型或类似的东西?

谢谢

尤利安

+0

我不明白你的目标是在这里。你想复制你的缓冲区newName方法吗? – Riduidel 2010-03-26 09:37:25

+0

我想为这两种类型使用相同的功能。这是我想要实现的。下面有一些答案帮助我做到这一点 – INS 2010-03-26 09:42:22

回答

4

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

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

此函数的两个参数界定在一起,所以一个HashMap<String, Integer>您只能通过String实例作为第一个参数。这可能是也可能不是你想要的:如果你只想从地图获取元素,乔恩的解决方案更简单,但如果你想将这个对象添加到地图,这是唯一的选择。

+0

这正是我想要的。非常感谢 – INS 2010-03-26 09:46:55

+0

@newacct ???在我的计数,它使用两次... – 2010-03-26 10:25:38

3

你想是这样的:

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

或(在评论中指出)

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

这将阻止你把任何东西纳入的地图,be因为你不能保证获得关键的权利 - 但你可以得到的地图的地图,并保证它们将是整数。

请注意,此版本不使该方法一般 - 这意味着它的简单,但它提供相同类型安全彼得的版本呢,你不能保证object是的正确的类型。每种方法都有其优点和缺点 - 根据方法的主体使用最合适的方法。 (如果你需要把一个进入地图,彼得的做法肯定是更好了。)

+0

当然,“扩展对象”部分是可选的 – newacct 2010-03-26 09:37:36

+0

@newacct:True。我会补充一点。 – 2010-03-26 09:38:53

+0

这是一个很好的答案,但符合我的目的的答案不是这一个。无论如何谢谢你的回答 – INS 2010-03-26 09:45:58