Java泛型的问题

Java泛型的问题,java,generics,Java,Generics,我正试图用泛型做些什么,但我似乎不明白。所以我有这个接口 public interface Transformation<A,B> { public B transform(A a); } 公共接口转换 但是我想让转换的左边部分保持通用,因为不同的foo将使用可能不同的数据以不同的方式计算它们的值。i、 e.一些FOO可能会从字符串列表中计算val,但如果我为每个字符串提供了正确的转换器,那么它应该可以工作。您必须精确匹配泛型: Transformation<

我正试图用泛型做些什么,但我似乎不明白。所以我有这个接口

public interface Transformation<A,B> {
    public B transform(A a);
}
公共接口转换


但是我想让转换的左边部分保持通用,因为不同的foo将使用可能不同的数据以不同的方式计算它们的值。i、 e.一些FOO可能会从字符串列表中计算val,但如果我为每个字符串提供了正确的转换器,那么它应该可以工作。

您必须精确匹配泛型:

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

啊,所以我终于找到了答案,正如老古董指出的,问题在于通配符。问题是编译器不知道它们最终都是相同的,这意味着我的Foo类实际上有另一个我没有想到的类型参数,用于计算最终结果的值的类型

public class Foo<T,I>{

    T val;
    Transformation<List<I>,T> transformation;

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

public static void main(String[] args){
    Foo<Double,Number> foo = nee Foo(new AveragingTransformer());
    List<Number> nums = new Arraylist<Number>();
    nums.add(2);
    nums.add(3);
    foo.setValue(nums);
}
公共类Foo{
T值;
转化;
公共void setVal(列表>){
val=转换。转换(列表);
}
}
公共静态void main(字符串[]args){
Foo-Foo=nee-Foo(新的AveragingTransformer());
List nums=new Arraylist();
增加(2);
增加(3);
foo.setValue(nums);
}

谢谢你给我指明了正确的方向

因为
转换
不是
转换,所以Double>
看看这个:还有这个:我在我的问题中添加了一个编辑在几乎所有遇到泛型问题的情况下,使用“?”是错误的解决方案。泛型中很少需要通配符。
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);
    }

}
    Transformation<List<Long>,Double> transformation  = new AveragingTransformer();
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();
}
public class Foo<T,I>{

    T val;
    Transformation<List<I>,T> transformation;

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

public static void main(String[] args){
    Foo<Double,Number> foo = nee Foo(new AveragingTransformer());
    List<Number> nums = new Arraylist<Number>();
    nums.add(2);
    nums.add(3);
    foo.setValue(nums);
}