到现在为止,我设法找到了我需要的所有答案,但这一个让我感到困惑。假设我们有示例代码:
public class Animal {
private String species;
private boolean canHop;
private boolean canSwim;
public Animal(String speciesName, boolean hopper, boolean swimmer) {
species = speciesName;
canHop = hopper;
canSwim = swimmer;
}
public boolean canHop() { return canHop; }
public boolean canSwim() { return canSwim; }
public String toString() { return species; }
}
public interface CheckAnimal {
public boolean test(Animal a);
}
public class FindSameAnimals {
private static void print(Animal animal, CheckAnimal trait) {
if(trait.test(animal)){
System.out.println(animal);
}
public static void main(String[] args) {
print(new Animal("fish", false, true), a -> a.canHop());
}
}
OCA Study Guide (Exam 1Z0-808) 书说这两行是等价的:
a -> a.canHop()
(Animal a) -> { return a.canHop(); }
这是否意味着,在幕后,Java 在第一种情况下将关键字 return 添加到代码中?
如果答案是肯定的,那么下一个代码将如何编译(想象其他一切都在适当的地方):
static int counter = 0;
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> counter++));
如果我们知道 execute 和 Runnable 的 运行 签名是:
void execute(Runnable command)
void run()
如果答案是否定的,那么 Java 如何知道什么时候需要返回什么东西,什么时候不需要?也许在
a -> a.canHop()
我们想忽略方法的 布尔 返回类型的情况。
原文由 Freeman 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,编译器生成字节码,它可能会生成相同的字节码,但不会更改语法,然后再次编译。
它可以选择忽略基于它正在考虑的功能接口的值。
可能
或者
基于上下文,但是如果可能的话它倾向于第一个。
考虑
ExecutorService.submit(Callable<T>)
和ExecutorService.submit(Runnable)
保存返回类型,您可以看到它是
Callable<Integer>
试试你自己,这里有一个更长的例子。
印刷
第一个
submit
取一个Runnable
所以Future.get()
返回null
第二个
submit
默认为Callable
所以Future.get()
返回2
The third
submit
can only be avoid
return value so it must be aRunnable
soFuture.get()
returnsnull