由两个其他泛型类型绑定的泛型类型限制

时间:2018-05-09 11:05:52

标签: java generics

我试图让一个方法的泛型返回类型受两个参数的泛型类型的约束,因为它应该是两者中最低的常见类型。例如:

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中实现这个编译时限制?

2 个答案:

答案 0 :(得分:2)

如何宣布TU从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,正如您所期望的那样,因为ArrayListHashSet都恰好延伸那个班。 AbstractCollection仍然会实现Collection,因此您的示例仍然适用。