我尝试使用默认方法扩展的接口(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);}
}
}