Правила приведения JLS кажутся довольно запутанными в этом отношении: правильно ли приводить ссылку на метод, возвращающий некоторое значение, к ссылке, принимающей те же типы аргументов, но возвращающей void
? Я думаю, что это нормально, потому что void
уже любого типа.
Например...
import java.util.function.Consumer;
public class MethodRefCaster {
/** Operation accepting and returning Integer. */
Integer fooOp(Integer x) {
System.out.println(x);
return x + 3;
}
/** Applier of given op accepting Integer, returning void. */
void applyOpToBar(Consumer<Integer> op, int bar) {
op.accept(bar);
}
public static void main(String [] args) {
MethodRefCaster x = new MethodRefCaster();
// Cast the method ref to make it fit.
x.applyOpToBar((Consumer<Integer>) x::fooOp, 42);
}
}
Это напечатает 42, как и следовало ожидать. Но правильная ли это Java? Большое спасибо.
Consumer<Integer>
не то же самое, чтоIntConsumer
, несмотря на приведение. - person Luiggi Mendoza   schedule 07.02.2018