Java 从实现捕获泛型类型
在一些Java代码中,我有这样一个接口:Java 从实现捕获泛型类型,java,generics,wildcard,Java,Generics,Wildcard,在一些Java代码中,我有这样一个接口: interface A<T> { T produce(); compare(T x, T y); } produceAndCompare(new B()); 接口A{ T生产(); 比较(tx,ty); } 我有不同的实现,例如: class B extends A<int[]> { int[] produce() {...} compare(int[] x, int[] y) {...} }
interface A<T> {
T produce();
compare(T x, T y);
}
produceAndCompare(new B());
接口A{
T生产();
比较(tx,ty);
}
我有不同的实现,例如:
class B extends A<int[]> {
int[] produce() {...}
compare(int[] x, int[] y) {...}
}
B类扩展了A类{
int[]product(){…}
比较(int[]x,int[]y){…}
}
问题是如何捕获特定于实现的泛型类型。以下操作不起作用:
A<T> a = new B();
T x = a.produce();
T y = a.produce();
a.compare(x, y);
A A=新B();
T x=a.product();
T y=a.product();
a、 比较(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);
}
如果需要先在变量中:
A<?> a = getSomeA(); //could just return new B();
produceAndCompare(a);
A=getSomeA()//可以只返回新的B();
生产和比较(a);
你已经知道了它的代码< int > [/c],为什么你要一个通用变量?很遗憾,在java中,Java缺少一个标识符,让编译器推断C++中的代码“<代码>自动<代码> >或<代码> var >代码,没有一个好方法来保持这个调用,而不是调用一个单行(除了反射)Sotirios:其他的实现可能使用不同的类型。他们仍然知道。如果您正在源代码中编写new B()
,您就知道A
的泛型类型参数是int[]
。也许你的例子并不能说明你想做什么。@SotiriosDelimanolis:如果我的答案中的假设是正确的,我认为在现实世界中,a
的实例化和后续操作是分开的。啊,所以你“利用”了方法绑定泛型的能力。很有趣。@ThomasAhle:没错。我在回答中给出了更详细的解释:。此外,本Java教程对该主题的介绍相当深入:声明和捕获泛型类型的唯一方法是方法定义,这似乎仍然很奇怪。如果功能已经在Java中,那么可能没有办法在实际代码中捕获类型吗?@ThomasAhle:我同意,他们将此添加到语言中是非常简单的。然而,我在现实世界中广泛使用泛型,一方面我可以计算出我想要它的次数,但我认为助手方法是不合适的。因此,也许有理由不使用该特性扩充语言。