简体   繁体   中英

Cannot convert void to java.lang.Void

I'm trying to do the following

interface Updater {
    void update(String value);
}

void update(Collection<String> values, Updater updater) {
    update(values, updater::update, 0);
}

void update(Collection<String> values, Function<String, Void> fn, int ignored) {
    // some code
}

but I get this compiler error:

"Cannot convert void to java.lang.Void"

That means updater::update cannot be used as Function<String, Void> .

Of course I can't write Function <String, void> and I don't want to change return type of update() to Void .

How do I resolve this problem?

A Function returns a value, even if it is declared as being of type Void (you will have to return null then. In contrast, a void method really returns nothing, not even null . So you have to insert the return statement:

void update(Collection<String> values, Updater updater) {
    update(values, s -> { updater.update(); return null; }, 0);
}

An alternative would be to change the Function<String,Void> to Consumer<String> , then you can use the method reference:

void update(Collection<String> values, Updater updater) {
    update(values, updater::update, 0);
}
void update(Collection<String> values, Consumer<String> fn, int ignored) {
    // some code
}

A function returns a value. What you are looking for is the java.util.function.Consumer interface. This has an void accept(T) method and doesn't return a value.

So you method becomes:

void update(Collection<String> values, Consumer<String> fn, int ignored) {
    // some code
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM