Curl的类型体系- -
Curl是带有泛型的语言。这不是新鲜事,现在所有的主流OO语言都支持泛型。不过Curl有一个很好的泛型应用。对于每一个类型,都有一个与之对应的Nullable类型。譬如说:
{define-class Dog {inherits Animal}}
实际上的情况是:
{alias #Dog {Nullable-of Dog}}
{define-class public Dog {inherits #Dog, Animal}}
也就是说,你不能把一个null值赋给类型为Dog的变量(或者参数),却可以赋给类型为#Dog的变量(或者参数)。而且Dog是可以隐式转型为#Dog的,#Dog要变成Dog则需要显式转型。譬如下面这个方法:
{method public {kill dog:#Dog} : Dog
{if dog == null then
{error "没有狗,我杀什么杀?"}
}
{dog.die}
{return dog asa Dog}
}
这么一来,使用kill方法的人就不用再操心会不会得到一只“null狗”,只管调用这条死狗的方法好了,不会有NullPointerException出来。另一方面,往kill方法里传参数的时候也知道:这个参数可以为null,kill方法自己会搞定“杀null狗”的情况,我就不必再多做一遍检查,只管往里面传就是了。我觉得Java也应该加入这样的类型体系,可以避免很多NullPointerException——这是最难调的异常,因为它总是不带任何调试信息。