Цейлонская функция высшего порядка
У меня есть код:
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", так как вызов его без аргументов, пустой кортеж, означает вызов его с супертипом того, что он хочет, от которого отказывается Цейлон. Так можно ли вообще getInt
вернулся с i2?
2 ответа
Давайте немного изменим ваш пример.
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
, но вы должны сначала проверить его:
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
является заполнителем для чего-то, что не может существовать.