元组和流的类型问题
Type problems with tuples & streams
我有自己的几个元组实现,这里是 pair 代码的要点:
public class Pair<A, B> extends Tuple implements Serializable{
...
public Pair(A a,B b){
this.a=a;
this.b=b;
}
...
public <T> Pair<T,B> mapA(Function<A,T> fun){
return new Pair<T,B>(fun.apply(a),b);
}
...
}
出于某种奇怪的原因,以下代码无法运行,编译器似乎认为第一个映射的结果对是 <Object,String>
。
List<Pair<String,String>> pairs = ...;
pairs
.stream()
.map(p->mapA(s->s.trim())
.map(p->mapA(s->s.toUpperCase()) //does not recognize a as a string
...
难道这也是 Eclipse 在作怪? 运行 Eclipse Luna fwiw 在从功能接口确定泛型类型方面似乎总体上做得很糟糕。
编辑:请求的完整示例
public class Pair<A, B> implements Serializable{
public final A a;
public final B b;
public Pair(A a,B b) {
this.a = a;
this.b = b;
}
public <T> Pair<T,B> mapA(Function<A,T> fun){
return new Pair<T,B>(fun.apply(a),b);
}
}
List<Pair<String,String>> pairs = new ArrayList<>();
pairs.add(new Pair<String,String>("foo","bar"));
pairs.stream()
.map(p->p.mapA(s->s.trim()))
.map(p->p.mapA(s->s.toUpperCase()))
.collect(Collectors.toList());
类型化方法的类型推断不适用于 lambda。
此外,您有一个编码错误(您在没有实例的情况下引用了 mapA()
方法)。
您可以通过明确键入以下方法来解决问题:
pairs.stream()
.map(p -> p.mapA(s -> s.trim())) // input type is known here from stream
.map(p -> p.<String>mapA(s -> s.toUpperCase())) // but not here
虽然只是样式问题,但您可以使用方法引用重写上面的内容:
pairs.stream()
.map(p -> p.mapA(String::trim))
.map(p -> p.<String>mapA(String::toUpperCase))
更新到 Eclipse Mars,问题完全消失。
我有自己的几个元组实现,这里是 pair 代码的要点:
public class Pair<A, B> extends Tuple implements Serializable{
...
public Pair(A a,B b){
this.a=a;
this.b=b;
}
...
public <T> Pair<T,B> mapA(Function<A,T> fun){
return new Pair<T,B>(fun.apply(a),b);
}
...
}
出于某种奇怪的原因,以下代码无法运行,编译器似乎认为第一个映射的结果对是 <Object,String>
。
List<Pair<String,String>> pairs = ...;
pairs
.stream()
.map(p->mapA(s->s.trim())
.map(p->mapA(s->s.toUpperCase()) //does not recognize a as a string
...
难道这也是 Eclipse 在作怪? 运行 Eclipse Luna fwiw 在从功能接口确定泛型类型方面似乎总体上做得很糟糕。
编辑:请求的完整示例
public class Pair<A, B> implements Serializable{
public final A a;
public final B b;
public Pair(A a,B b) {
this.a = a;
this.b = b;
}
public <T> Pair<T,B> mapA(Function<A,T> fun){
return new Pair<T,B>(fun.apply(a),b);
}
}
List<Pair<String,String>> pairs = new ArrayList<>();
pairs.add(new Pair<String,String>("foo","bar"));
pairs.stream()
.map(p->p.mapA(s->s.trim()))
.map(p->p.mapA(s->s.toUpperCase()))
.collect(Collectors.toList());
类型化方法的类型推断不适用于 lambda。
此外,您有一个编码错误(您在没有实例的情况下引用了 mapA()
方法)。
您可以通过明确键入以下方法来解决问题:
pairs.stream()
.map(p -> p.mapA(s -> s.trim())) // input type is known here from stream
.map(p -> p.<String>mapA(s -> s.toUpperCase())) // but not here
虽然只是样式问题,但您可以使用方法引用重写上面的内容:
pairs.stream()
.map(p -> p.mapA(String::trim))
.map(p -> p.<String>mapA(String::toUpperCase))
更新到 Eclipse Mars,问题完全消失。