[英]Ceylon Higher Order Function
我有代碼:
shared Integer getInt() {
return 42;
}
shared Integer() i1() {
return getInt;
}
shared Callable<Integer,Nothing> i2() {
return getInt;
}
shared Callable<Integer,[]> i3() {
return getInt;
}
void run() {
// OK
i1()();
// Illegal `[] is not assignable to Nothing`
i2()();
// OK
i3()();
}
我不知道為什么編譯器可以使用“ i2”聲明。 什么都不是一切的子類型,因此也不是空元組的子類型,因此我可以理解為什么可以進行聲明。 但是一旦完成,對我來說,正常調用“ i2”似乎是不可能的,因為沒有參數調用它,空元組意味着以錫蘭拒絕的想要的超類型調用它。 那么有可能完全調用從i2返回的getInt
嗎?
讓我們稍微修改一下示例。
shared Integer getInt(Integer x) {
return 42 + x;
}
shared Integer(Integer) i1() {
return getInt;
}
shared Callable<Integer,Nothing> i2() {
return getInt;
}
shared Callable<Integer,[Integer]> i3() {
return getInt;
}
正如您提到的, Nothing
是[]
的子類型,因為它是所有內容的子類型。 它也是[Integer]
子類型。
類型Callable<Integer, Nothing>
描述了任何返回Integer
函數。 但是,它沒有說不帶任何參數。
可以調用從i2
返回的函數function,但是您需要先對其進行類型檢查:
val gi = i2();
if(is Callable<Integer, [Integer, Integer]> gi) {
gi(1,2);
}
上面的示例很好,因為[Integer, Integer]
可分配給[Integer]
,因此Callable<Integer, [Integer]>
可分配給Callable<Integer, [Integer, Integer]>
,因為Callable
的第二個類型參數是互變的。
Callable<Integer, Nothing>
是合法的,因為第二個類型參數必須滿足Anything[]
,而Nothing
則必須這樣做,因為就像您所說的,它是每種類型的子類型。 但是,此類函數永遠不能調用,因為它期望Nothing
的實例,並且不存在任何此類實例。
您可以執行apply(i2(), nothing)
,這會使類型檢查器感到滿意,但是當然會在運行時崩潰,因為nothing
東西是不存在的東西的占位符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.