Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从实现捕获泛型类型_Java_Generics_Wildcard - Fatal编程技术网

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) {...} }

在一些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) {...}
}
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:我同意,他们将此添加到语言中是非常简单的。然而,我在现实世界中广泛使用泛型,一方面我可以计算出我想要它的次数,但我认为助手方法是不合适的。因此,也许有理由不使用该特性扩充语言。