键入元组问题&流

时间:2015-07-02 22:49:47

标签: java lambda tuples java-stream keyvaluepair

我有几个元组的自己的实现,这里是对代码的要点:

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

2 个答案:

答案 0 :(得分:4)

对于类型化方法的类型推断不适用于lambdas。

此外,您遇到编码错误(您在没有实例的情况下引用了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))

答案 1 :(得分:0)

已更新至Eclipse Mars,问题已完全消失。