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);
}