我想知道在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>
我的问题是: 这可以用更优雅的解决方案/使用泛型或类似的东西来制作吗?
谢谢,
尤利安
答案 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
属于正确的类型。每种方法都有其优点和缺点 - 根据方法的主体使用最合适的方法。 (如果你需要在地图中输入一个条目,彼得的方法肯定会更好。)