Приведение ссылки Java к методу, возвращающему значение, в один возвращающий `void`

Правила приведения 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? Большое спасибо.


person Gene    schedule 07.02.2018    source источник
comment
Я ожидал, что это не удастся, потому что Consumer<Integer> не то же самое, что IntConsumer, несмотря на приведение.   -  person Luiggi Mendoza    schedule 07.02.2018
comment
Ну, это работает, но я не хотел запутать проблему, поэтому изменю операцию на Integer -> Integer. Спасибо.   -  person Gene    schedule 07.02.2018
comment
На самом деле, я бы оставил все как есть, потому что действительно интересно, что оно не дает сбоев.   -  person Luiggi Mendoza    schedule 07.02.2018
comment
@LuiggiMendoza Возможно, но я думал, что преимущество IntConsumer просто в предотвращении распаковки.   -  person Gene    schedule 07.02.2018
comment
Я проведу больше исследований по этому поводу самостоятельно (ваш исходный код разжег мое любопытство).   -  person Luiggi Mendoza    schedule 07.02.2018
comment
Я не уверен, что Java заботит тип возвращаемого значения, пока время выполнения не попытается взять возвращаемое значение и вставить его в ссылку на тип возвращаемого значения. Типы возвращаемых значений не являются частью сигнатуры Java при определении уникальности, поэтому может возникнуть неопределенность.   -  person billjamesdev    schedule 07.02.2018