gpt4 book ai didi

java - Java 泛型的问题

转载 作者:行者123 更新时间:2023-11-29 04:47:59 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com