请注意: 我误解了这个问题,所以这个答案与问题的要求相反。我将把它作为社区 wiki 留作参考,但这并不能回答最初的问题。
如果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 方法将返回两种类型的 HashMaps,具体取决于传入的 boolean。HashMap<Integer, String> 或 HashMap<Double, String> 由 doSomething 方法返回。
实际上用boolean 调用doSomething 可以这样完成:
Map<? extends Number, String> map1 = doSomething(true);
Map<? extends Number, String> map2 = doSomething(false);
map1 将以 Hashmap<Integer, String> 结尾,而 map2 将得到 Hashmap<Double, String>。