Given:
class Bird {
public void fly() {
System.out.print("Can fly");
}
}
class Penguin extends Bird {
public void fly() {
System.out.print("Cannot fly");
}
}
and the code fragment:
class Birdie {
public static void main(String[] args) {
fly(() -> new Bird());
fly(Penguin::new);
}
/* line n1 */
}
Which code fragment, when inserted at line n1, enables the Birdie class to compile?
A.
static void fly (Consumer<Bird> bird) {
bird::fly();
}
B.
static void fly (Consumer<? extends Bird> bird) {
bird.accept().fly();
}
C.
static void fly (Supplier<Bird> bird) {
bird.get().fly();
}
D.
static void fly (Supplier<? extends Bird> bird) {
bird::fly();
}
題解
以下分別是Consumer和Supplier介面於JDK的原始碼片段:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
@FunctionalInterface
public interface Supplier<T> {
T get();
}
從原始碼可以很清楚知道:Consumer介面的accept方法只能從參數接受物件,不能回傳物件;而Supplier介面的get方法只能回傳物件,不能接受參數。所以選項C是正確答案。