从实现中捕获泛型类型

时间:2015-03-27 15:29:24

标签: java generics wildcard

在某些Java代码中,我有一个这样的界面:

interface A<T> {
    T produce();
    compare(T x, T y);
}

我有不同的实现,例如:

class B extends A<int[]> {
    int[] produce() {...}
    compare(int[] x, int[] y) {...}
}

问题是如何捕获特定于实现的泛型类型。以下不起作用:

A<T> a = new B();
T x = a.produce();
T y = a.produce();
a.compare(x, y);

因为T类型当然没有引用B内的内容。 (事实上​​它并没有提到任何东西。)

有没有办法让T捕获B的泛型类型?

1 个答案:

答案 0 :(得分:2)

如果我能稍微阅读这些内容,我想您所问的是如何使这一部分特别通用:

T x = a.produce();
T y = a.produce();
a.compare(x, y);

答案通常是使用通用方法“绑定”类型参数:

private static <T> void produceAndCompare(A<T> a) {
    T x = a.produce();
    T y = a.produce();
    a.compare(x, y);
}

然后你可以这样称呼它:

produceAndCompare(new B());

如果首先需要变量:

A<?> a = getSomeA(); //could just return new B();
produceAndCompare(a);