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是正確答案。