简单问题:在下面的泛型类中,如何定义泛型类型和包含的类型以使它们可以为空?以下内容无法编译。
class Pair? of G1, G2: Object
_first:G1?
_second:G2?
construct()
_first = null
_second = null
def insert( first:G1, second:G2 )
_first = first
_second = second
def insert_first( value:G1 )
_first = value
def insert_second( value:G2 )
_second = value
def second():G2
return _second
用法:
var pair = new Pair() of string, string
pair = null
答案 0 :(得分:2)
由于Vala Generics的工作方式,通用参数始终可以为空。
只要你不打开--enable-experimental-non-null
类变量也可以为空,所以你的代码简化为:
[indent=4]
class Pair of G1, G2: Object
_first:G1
_second:G2
construct()
_first = null
_second = null
def insert( first:G1, second:G2 )
_first = first
_second = second
def insert_first( value:G1 )
_first = value
def insert_second( value:G2 )
_second = value
def second():G2
return _second
init
var pair = new Pair of string, string
pair = null
当--enable-experimental-non-null
打开时,您必须明确变量的类型。我不知道怎么用Genie写这个,我试过这个,但是编译器不喜欢它:
init
pair: Pair? of string, string = new Pair of string, string
pair = null
在Vala,没问题:
class Pair<G1,G2>: Object {
private G1 first;
private G2 second;
public Pair () {
first = null;
second = null;
}
// ...
}
int main () {
Pair<string, string>? pair = new Pair<string, string> ();
pair = null;
return 0;
}
答案 1 :(得分:2)
我无法理解类型为null的类型参数的概念。我认为这不是一个有用的概念。所以你班级的定义是:
[indent = 4]
class Pair of G1, G2: Object
_first:G1?
_second:G2?
def insert( first:G1, second:G2 )
_first = first
_second = second
def insert_first( value:G1 )
_first = value
def insert_second( value:G2 )
_second = value
def second():G2
return _second
如果必须将具有对象实例的变量重新分配给null,那么它将是:
[indent = 4]
init
var pair = new Pair of string,string()
pair = null
但是,当Vala编译器超出范围时,它将取消引用pair
。所以我不确定你为什么需要指定null。
理想情况下,只有在我的视图中与C库连接时才使用空值。如果没有正确检查,访问null可能会导致崩溃(分段错误)。例如:
init
a:int? = 1
a = null
var b = a + 1
Vala编译器确实有一个实验性的非null模式,可以检查不安全的代码。如果使用Vala开关--enable-experimental-non-null
编译以下内容:
[indent = 4]
init
var pair = new Pair of string,string()
pair = null
你会收到错误:
error: Assignment: Cannot convert from
null'到Pair<string,string>'
如果您了解后果,那么您可以通过以下方式告诉编译器:
[indent = 4]
init
pair:Pair? = new Pair of string,string()
pair = null