У меня есть класс Java, который принимает Function[String, Void]
, что похоже на функциональный интерфейс Consumer
.
Тогда этот класс должен использовать Consumer
. В первом приближении Function<String, Void>
никогда не подходит для использования. Если вы не можете изменить это, по крайней мере, знайте, что это плохой дизайн, и будьте осторожны с этой библиотекой. Ответ Som-snytt уже показывает, как правильно вызывать temp
из Scala, и при желании просто написать неявное преобразование из String => Unit
в Function[String, Void]
. Итак, остальная часть этого ответа посвящена тому, почему другие ваши попытки не сработали.
поскольку это недействительный эквивалент
Точно: это эквивалентно void
, а не Void
. Эквивалентный код Java вызовет метод void
, например. Consumer.accept
:
public void tempOfVoid(Consumer<String> f) {
temp(new Function<String, Void> {
public Void apply(String x) {
return f.accept(x);
}
};
}
и не сможет проверить тип. Вместо этого вам нужно
public Void apply(String x) {
f.accept(x);
return null;
}
так же, как показано в Scala ответом som-snytt.
Теперь вы можете спросить: что происходит, когда Unit
является аргументом типа, поскольку void
не может быть, или когда значение типа Unit
должно быть представлено во время выполнения (например, val x: Any = ()
)? В этих случаях Unit
вместо этого представлен классом scala.runtime.BoxedUnit
, точно так же, как Int
обычно переводится в int
, но иногда и в java.lang.Integer
. Это объясняет, почему приведение к Void
вызывает исключение (и не приводит к ошибке компиляции). Void
не является подходящим переводом для этих случаев, потому что у него нет значений (отличных от null
), в то время как Unit
имеет ровно одно: ()
.
person
Alexey Romanov
schedule
25.05.2017
.asInstanceOf[(String) => Void]
? - person Aluan Haddad   schedule 25.05.2017Consumer
. Если вы не можете изменить это, по крайней мере, знайте, что это плохой дизайн, и будьте осторожны с этой библиотекой. поскольку это недействительный эквивалент Да, это эквивалентноvoid
, а неVoid
. Таким образом, вы получаете несоответствие типов, как если бы вы использовали метод Java, возвращающийvoid
. - person Alexey Romanov   schedule 25.05.2017