java - 从实现中捕获通用类型

标签 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的泛型类型?

最佳答案

如果我能读懂字里行间的意思,我想你要问的是如何使这一部分变得特别通用:

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 - 从实现中捕获通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29304404/

相关文章:

java - SWT 浏览器似乎在我丢弃后仍然存在

java - Spring CrudRepository 无法共享复合主键中生成的 id

python - 函数定义上的正则表达式 findall。想要匹配参数但不匹配函数

java - 当我想比较某些东西取决于它的属性时,是否可以使用比较器

java - 根据消息类型选择消息实现

java - 使用泛型覆盖 Java 枚举中的方法

java - 重载泛型方法时 Java 5 和 6 之间的不同行为

c++ - 当 List<List<X>> 时,模板在 C++ 中删除

python - 单独调用规则的变量并为特定规则添加独立的环境

java - 带有通配符和空值的sql语句