Как назвать такую функцию scala?Как вызвать функцию scala, принимающую значение типа Void
def f(v: Void): Unit = {println(1)}
Я еще не нашел значение типа Void в Scala.
Как назвать такую функцию scala?Как вызвать функцию scala, принимающую значение типа Void
def f(v: Void): Unit = {println(1)}
Я еще не нашел значение типа Void в Scala.
Я считаю, что с помощью Void
/null
в Java аналогично использованию Unit
/()
в Scala. Рассмотрим это:
abstract class Fun<A> {
abstract public A apply();
}
class IntFun extends Fun<Integer> {
public Integer apply() { return 0; }
}
public static <A> A m(Fun<A> x) { return x.apply(); }
Теперь, когда мы определили общий метод m
мы также хотим, чтобы использовать его для классов, где apply
полезно только для его побочных эффектов (т.е. мы должны вернуть то, что ясно указывает, что это бесполезно). void
не работает, так как он ломает Fun<A>
договор. Нам нужен класс с только одно значение, которое означает «падение возвращаемое значение», и это Void
и null
:
class VoidFun extends Fun<Void> {
public Void apply() { /* side effects here */ return null; }
}
Так что теперь мы можем использовать m
с VoidFun
.
В использовании Scala в null
обескураживают и Unit
используется вместо (он имеет только одно значение ()
), поэтому я считаю, что метод, который вы упомянули предназначалась для вызова из Java. Для совместимости с Java Scala имеет null
, который является единственным экземпляром класса Null
. Это, в свою очередь, подтип любого ссылочного класса, поэтому вы можете назначить null
любой переменной ссылочного класса. Таким образом, рисунок Void
/null
работает также в Скала.
Void
, или более конкретно, java.lang.Void
, имеет следующие в documentation:
The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.
В Scala нет ключевого слова void
, поэтому Void
типа, по существу, бесполезный в Scala. Самая близкая вещь - это функция без параметров, то есть def f: Unit = {println(1)}
, которую вы можете вызвать с помощью f
или f()
или Unit
для функций, которые ничего не возвращают, как в вашем примере.
Я читал [функцию] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala#L61), что возьмите значение типа «Void» в другой базе кода, поэтому я составил более простой для тестирования. – zyxue
Выполняется ли функция при вызове 'f (_)' или создается частично примененная функция? EDIT: Я также понимаю, что я действительно не ответил на ваш вопрос :) – spiffman
Нет, вы правы. Я все еще неправ. Можете ли вы помочь мне взглянуть на [функцию] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala # L61) выше и комментировать, что происходит? – zyxue
'f (null)' может быть? –
Работает как очарование! Но почему 'null' работает, как это связано с' Void'? – zyxue
Тип 'Null' (из которого' null' является экземпляром) является подклассом для всех ссылочных типов (http://docs.scala-lang.org/resources/images/classhierarchy.img_assist_custom.png). 'Void' является ссылочным типом (подкласс' Object', aka 'AnyRef'). –