【问题标题】:How to call a scala function taking a value of Void type如何调用采用 Void 类型值的 scala 函数
【发布时间】:2016-09-27 23:27:24
【问题描述】:

如何调用这样的scala函数?

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

我还没有在 Scala 中找到 Void 类型的值。

【问题讨论】:

  • f(null) 也许?
  • 像魅力一样工作!但是为什么null 有效,它与Void 有什么关系?
  • 类型Null(其中null是一个实例)是所有引用类型(docs.scala-lang.org/resources/images/…)的子类。 Void 是一个引用类型(Object 的子类,又名AnyRef)。

标签: scala void


【解决方案1】:

我相信在 Java 中使用 Void/null 类似于在 Scala 中使用 Unit/()。考虑一下:

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&lt;A&gt; 合同。我们需要一个只有一个值的类,即“删除返回值”,它是Voidnull

class VoidFun extends Fun<Void> {
  public Void apply() { /* side effects here */ return null; }  
}

所以现在我们可以使用mVoidFun

在 Scala 中不鼓励使用null,而是使用Unit(它只有一个值()),所以我相信你提到的方法是打算从Java 调用的。为了与 Java Scala 兼容,null 是类 Null 的唯一实例。它又是任何引用类的子类型,因此您可以将null 分配给任何引用类变量。所以Void/null 模式也适用于 Scala。

【讨论】:

    【解决方案2】:

    Void,或者更具体地说,java.lang.Void,在documentation 中有以下内容:

    Void 类是一个不可实例化的占位符类,用于保存 对表示 Java 关键字 void 的 Class 对象的引用。

    在 Scala 中,没有关键字 void,因此 Void 类型在 Scala 中基本上没用。最接近的是没有参数的函数,即def f: Unit = {println(1)},您可以使用ff() 调用它,或者Unit 类型用于不返回任何内容的函数,如您的示例所示。

    【讨论】:

    • 我在另一个代码库中读取了一个function,它的值是Void,所以我做了一个更简单的测试。
    • 当您调用f(_) 时该函数是否实际运行,或者它是否创建了一个部分应用的函数?编辑:我也意识到我并没有真正回答你的问题:)
    • 不,你是对的。我还是错了。你能帮我看看上面的function 并评论发生了什么吗?
    • 好吧,你可能可以运行部分应用的函数,即val pF = f(_),然后运行pF()
    • 它对你有用吗?我仍然收到错误:&lt;console&gt;:14: error: not enough arguments for method apply: (v1: Void)Unit in trait Function1.
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 2013-06-12
    相关资源
    最近更新 更多