Java 8 Lambda无法调用默认接口方法

时间:2015-08-12 17:32:59

标签: java lambda java-8

我尝试使用默认方法扩展的接口(Mapper)。在解决问题的同时,似乎从普通的lambda语法中无法访问被实例化的接口的默认方法。这是非常不受欢迎的。

有人可以验证吗?有工作吗?这个问题是否已为Oracle的Java人员所知?

public class LambdaTest {

@Test
public void test() {
    assertEquals((Long)10L, map((number) -> {return Long.valueOf(number);}, 10));

    //Fails on convert: The method convert(Integer) is undefined for the type LambdaTest
    assertEquals((Long)10L, map((number) -> {return convert(number);}, 10));

    //Works
    assertEquals((Long)10L, map(new Mapper<Long>() {
        @Override
        public Long map(Integer number) {
            return convert(number);
        }
    }, 10));

    //Fails on this: The method convert(Integer) is undefined for the type LambdaTest
    assertEquals((Long)10L, map((number) -> {return this.convert(number);}, 10));

    //Works
    assertEquals((Long)10L, map(new Mapper<Long>() {
        @Override
        public Long map(Integer number) {
            return this.convert(number);
        }
    }, 10));

    //Fails on Mapper.this: No enclosing instance of the type LambdaTest.Mapper<T> is accessible in scope
    assertEquals((Long)10L, map((number) -> {return Mapper.this.convert(number);}, 10));

    //Fails on Mapper.this: No enclosing instance of the type LambdaTest.Mapper<T> is accessible in scope
    assertEquals((Long)10L, map(new Mapper<Long>() {
        @Override
        public Long map(Integer number) {
            return Mapper.this.convert(number);
        }
    }, 10));
}

public <T> T map(Mapper<T> mapper, int number) {
    return mapper.map(number);
}

interface Mapper<T> {
    T map(Integer number);
    default Long convert(Integer number) { return Long.valueOf(number);}
}
}

0 个答案:

没有答案