我试图让一个方法的泛型返回类型受两个参数的泛型类型的约束,因为它应该是两者中最低的常见类型。例如:
class Scratch {
static <T, U, R /*additional restrictions*/> R getLowestCommon(T t, U u) {
return null;
}
public static void main(String[] args) {
Object o = getLowestCommon("", 1);
CharSequence s = getLowestCommon("", new StringBuilder());
Number n = getLowestCommon(1L, 2D);
Collection<Integer> c = getLowestCommon(new ArrayList<Integer>(), new HashSet<Integer>());
// this should give an error because ArrayList's and HashSet's lowest common supertype is Collection
List<Integer> l = getLowestCommon(new ArrayList<Integer>(), new HashSet<Integer>());
}
}
我知道this对交集类型的限制,但有没有办法在Java中实现这个编译时限制?
答案 0 :(得分:2)
如何宣布T
和U
从R扩展。
static <T extends R, U extends R, R > R getLowestCommon(T t, U u)
答案 1 :(得分:2)
你过于复杂了。您只需要一个泛型类型参数,Java将推断其余参数:
static <T> T getLowestCommon(T t, T u) {
return null;
}
在这种情况下,它实际上会将返回类型推断为AbstractCollection
,而不是Collection
,正如您所期望的那样,因为ArrayList
和HashSet
都恰好延伸那个班。 AbstractCollection
仍然会实现Collection
,因此您的示例仍然适用。