2016-09-27 5 views
0

Как назвать такую ​​функцию scala?Как вызвать функцию scala, принимающую значение типа Void

def f(v: Void): Unit = {println(1)} 

Я еще не нашел значение типа Void в Scala.

+2

'f (null)' может быть? –

+0

Работает как очарование! Но почему 'null' работает, как это связано с' Void'? – zyxue

+1

Тип 'Null' (из которого' null' является экземпляром) является подклассом для всех ссылочных типов (http://docs.scala-lang.org/resources/images/classhierarchy.img_assist_custom.png). 'Void' является ссылочным типом (подкласс' Object', aka 'AnyRef'). –

ответ

1

Я считаю, что с помощью 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 работает также в Скала.

0

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 для функций, которые ничего не возвращают, как в вашем примере.

+0

Я читал [функцию] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala#L61), что возьмите значение типа «Void» в другой базе кода, поэтому я составил более простой для тестирования. – zyxue

+0

Выполняется ли функция при вызове 'f (_)' или создается частично примененная функция? EDIT: Я также понимаю, что я действительно не ответил на ваш вопрос :) – spiffman

+0

Нет, вы правы. Я все еще неправ. Можете ли вы помочь мне взглянуть на [функцию] (https://github.com/bigdatagenomics/adam/blob/master/adam-core/src/main/scala/org/bdgenomics/adam/converters/FastqRecordConverter.scala # L61) выше и комментировать, что происходит? – zyxue

 Смежные вопросы

  • Нет связанных вопросов^_^