请注意:我错误地理解了这个问题,所以这个答案与问题所要求的是相反的。我将把它留作社区维基的参考,但这并不能回答原来的问题。
如果有一个常见的亚型,以Type1
和Type2
称为SuperType
,然后说,第一类是? extends SuperType
会工作。
下面是一个使用Integer
和Double
为两种类型一个小例子,他们共同的祖先为Number
:
private Map<Integer, String> doSomethingForInteger() {
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(10, "Hello");
return map;
}
private Map<Double, String> doSomethingForDouble() {
HashMap<Double, String> map = new HashMap<Double, String>();
map.put(3.14, "Apple");
return map;
}
public Map<? extends Number, String> doSomething(boolean b) {
if (b)
return doSomethingForInteger();
else
return doSomethingForDouble();
}
这里,doSomething
方法将根据boolean
即返回两种类型的HashMap
小号通过.方法返回HashMap<Integer, String>
或HashMap<Double, String>
。
实际上调用doSomething
与boolean
可以完成这样的:
Map<? extends Number, String> map1 = doSomething(true);
Map<? extends Number, String> map2 = doSomething(false);
map1
将结束与Hashmap<Integer, String>
,而map2
会得到Hashmap<Double, String>
。
是的,这也是我想出来的。我同意一种方法不应该对调用者有依赖性。 但是,如果doSomethingFor1()和doSomethingFor2()共享完全相同的代码,唯一的区别是它们添加哪个对象作为映射的键?这不会是一个重复的代码? – 2009-05-28 05:59:31
重复必须通过适当地重构函数并将重复代码放置在常用函数/方法中来抵消。 – jrharshath 2009-05-28 06:37:12
@ The Dissonant:使用一个参数来指示添加哪个键。不要从谁打电话给你。 – 2009-05-28 06:39:25