我正试图获得IZO-809认证,我正在阅读OCA/OCP SE8测试手册,其中的一段代码确实引起了我的注意。
密码让我想到了这个问题。
我知道消费者得到一个参数而不返回任何东西,而供应商没有参数并返回一个值。
但是这段代码在->之后几乎是一样的。
public class Pregunta24{
private final Object obj;
public Pregunta24(final Object obj){
this.obj = obj;
}
}
//Returns a Supplier
private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
//Returns a Consumer.
private final Consumer<Pregunta24>consumer = a->new Pregunta24(a);这两种密码都能用。
但是,如果这个代码不起作用,我知道消费者不会返回任何东西。
private final Consumer<String>consumerString = String::length我知道这不起作用,因为消费者没有返回一个值,我的问题是在供应商代码和消费者代码中,代码就在->标记之后,但是这次被认为是返回,实际上是类的一个实例。
我的问题是,为什么Java有时抱怨返回值而不是什么?
我是说这个密码。
private final Supplier<Pregunta24>supplier = ()->new Pregunta24("HI");
// I would think is returning a instance of the Pregunta24 class.
private final Consumer<Pregunts24>consumer = a->new Pregunta24(a);是在->之后返回相同的,但是为什么消费者不说错误。
incompatible types: bad return type in lambda expression但如果我这么做的话
final Consumer<String>consumerString = a->1;我认为->之后的代码是上下文推断的。
发布于 2018-06-01 16:01:04
根据javadoc 消费者
表示接受单个输入参数而不返回结果的操作。
Consumer<Pregunts24>consumer = a->new Pregunta24(a);实际上什么都不回。这基本上是Consumer#accept方法的实现,它接受T类型的对象,并以void作为返回类型。
public void accept(Pregunta24 a) {
new Pregunta24(a);
}你什么都没还给我。同事
Consumer<String>consumerString = String::length
public void accept(String a) {
a.length();
}然而,
Consumer<String>consumerString = a->1;是一个无效的表达式,它被翻译成如下所示:
public void accept(String a) {
1;
}https://stackoverflow.com/questions/50646351
复制相似问题