无法从java.lang.Integer转换为R.

时间:2017-01-08 09:32:19

标签: java java-8 java-stream

我有以下代码:

class inner {
    Integer i;
    public Integer getValue() {
        return i;
    }
    public void setValue(Integer i) {
        this.i = i;
    }
}

class outer {
    public static inner i1;

    outer(Integer i) {
        i1.setValue(i);
    }
}

public class MyClass{
public void main() {
    List<Integer> ll = Arrays.asList(new outer(2)).stream().map(outer.i1::getValue).collect(Collectors.toList());

}

我收到以下错误:

required: Function<? super Object,? extends R>
  found: outer.i1::getValue
  reason: cannot infer type-variable(s) R
    (argument mismatch; invalid method reference
      method getValue in class inner cannot be applied to given types
        required: no arguments
        found: Object
        reason: actual and formal argument lists differ in length)
  where R,T are type-variables:
    R extends Object declared in method <R>map(Function<? super T,? extends R>)

我是溪流的新手,阅读文档并不能解决这个问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

getValue是一个不带参数的方法。 当您尝试将getValue的方法引用传递给Stream的{​​{1}}方法时,您试图将map的元素传递给Stream,但是getValue没有任何论据。

如果您想忽略Stream的getValue元素,可以用lambda表达式替换方法引用:

outer

但是,这会导致List<Integer> ll = Arrays.asList(new outer(2)).stream().map(o -> outer.i1.getValue()).collect(Collectors.toList()); ,因为您没有在任何地方初始化NullPointerException,因此调用public static inner i1构造函数会抛出该异常。

很难在不知道你想要做什么的情况下建议如何解决这个问题。

我不知道在outer类中是否有一个inner类型的静态成员是有意义的,但是如果它有意义,你应该在静态初始化块中初始化它(或在其声明中。)

例如,您可以更改

outer

public static inner i1;

将消除异常。