java - Java 泛型的问题

标签 java generics

我正在尝试使用泛型做一些事情,但我似乎无法弄清楚。所以我有这个界面。

public interface Transformation<A,B> {
    public B transform(A a);
}

我有一个实现它的类。

public class AveragingTransformer implements Transformation<List<Long>,Double> {

    public Double transform(List<Long> a) {
        return a.get(0).doubleValue()/a.get(1);
    }

}

所以在我的主要方法中我有这个...

public static void main(String[] args){
    ....
    Transformation<List<?>,Double> transformation = new AveraginTransformer();
    ....
}

但是由于某种原因这不起作用,任何人都可以帮助我理解为什么吗?

编辑

所以问题是,如果我想将一个数组传递给我的转换,我似乎无法让编译器接受它。

那么说我有...

public class foo<T>{

    T val;
    Transformation<? extends List<?>,T> transformation; //This gets initialized by constructor, where I will pass in the averaging transformer in this case.

    public void setVal(List<?> list){
        val = transformation.transform(list);
    }

}

如果我尝试这样做,它会给我这个错误

enter image description here

但我想保留转换的左侧部分的通用性,因为不同的 foo 会使用可能不同的数据以不同的方式计算它们的值。即,一些 foo 可能会从字符串列表中计算出它们的值,但如果我为每个字符串提供正确的转换器,那么它应该可以工作。

最佳答案

您必须完全匹配泛型:

    Transformation<List<Long>,Double> transformation  = new AveragingTransformer();

即更改 List<?>List<Long> .

如果您希望该工具适用于多种类型,请选择合适的已实现接口(interface)。例如这里Long工具 Number所以我会回到List<Number> .

public interface Transformation<A, B> {

    public B transform(A a);
}

public class AveragingTransformer implements Transformation<List<Number>, Double> {

    @Override
    public Double transform(List<Number> a) {
        return a.stream().mapToDouble(v -> v.doubleValue()).average().orElse(0);
    }

}

public void test() {
    Transformation<List<Number>, Double> transformation = new AveragingTransformer();
}

关于java - Java 泛型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430521/

相关文章:

java - 获取 java.lang.RuntimeException : java. util.concurrent.TimeoutException

java - 我在这个接口(interface)和方法中使用 Java 泛型做错了什么?

Java EE Web 应用程序文件创建

Java 堆栈自省(introspection)

java - Hadoop Reducer在JAVA中两次迭代

java - 通用 Map.entrySet() 的返回类型

java - 使用 DbUtils BeanListHandler 在可重用 JavaFX 数据检索服务上摸索通用类型

java - 使用 spark-submit 和 java -cp 运行 spark 应用程序时有什么区别?

Java 泛型 - 实现和扩展

c# - 方法和约束的唯一性