在一些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的通用类型?

最佳答案

如果我能在两行之间读到一点,我想您要问的是如何使这部分特别通用:

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);

10-06 13:57