约束一个scala类型,以便我永远不需要检查null?

时间:2014-06-03 11:29:36

标签: scala functional-programming

def myMethod(dog: Dog) = {
   require (dog != null) // is it possible to already constraint it in the `Dog` type?
}

有没有办法构建Dog,使ADT永远不能接受null从而消除任何空检查? (我不想在这里Option,否则我的所有代码都会转为基于Option,我希望已经限制Dognull永远不可能,这就是type system允许我在程序中指定约束的原因。)

2 个答案:

答案 0 :(得分:3)

尝试提供此类功能(例如我在2.10.4中运行):

class A extends NotNull
defined class A

val x: A = null
// <console>:8: error: type mismatch;
// found   : Null(null)
// required: A
//       val x: A = null
                  ^

虽然它从未完成,eventually got deprecated。至于写作时间,我认为不可能以阻止你为空的方式构建一个层次结构without additional nullity checking analysis

查看相关故障单中的评论以获取洞察力

答案 1 :(得分:2)

我认为这不可能,因为Java会破坏一切。如果您有一个返回Dog的Java方法,那么无论您向Scala添加什么语言/类型功能,都可以为null。即使在Scala代码中,也可以传递null,最后传递给myMethod。

因此,您不能在Scala中使用非null类型而不会失去Scala对象是Java对象的互操作性属性(至少对于相关类型而言)。

不幸的是,继承使得计算机很难在一般情况下知道一个方法是否可以传递一个源自Java的对象 - 除非一切都是最终的/密封的,你总是可以将一个处理该对象的类子类化为一些指向并覆盖狗返回方法。因此,它需要毛茸茸的完整程序分析来确定所有内容的具体类型(并记住,使用哪些具体类型可能取决于运行时输入!)只是以确定给定的案例不能涉及Java代码。