从实现中捕获通用类型
Capturing a Generic Type from an Implementation
在某些 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);
答案通常是 "bind" 使用泛型方法的类型参数:
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);
在某些 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);
答案通常是 "bind" 使用泛型方法的类型参数:
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);