0

私はコードを持っています:

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」宣言で問題ない理由はわかりません。Nothing はすべてのサブタイプではないため、空のタプルのサブタイプであるため、宣言を行うことができる理由はある程度理解できます。しかし、いったんそれを行うと、「i2」を引数なしで呼び出すことは不可能に思えます。空のタプルは、Ceylonが拒否する、必要なもののスーパータイプで呼び出すことを意味します。getIntそれで、i2から返されたを呼び出すことはまったく可能ですか?

4

2 に答える 2

1

あなたの例を少し変更しましょう。

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]ます。

TypeCallable<Integer, Nothing>は、 を返す関数を表しますInteger。ただし、引数がないとは言っていません。

から返された関数関数を呼び出すことは可能i2ですが、最初に型チェックする必要があります:

val gi = i2();
if(is Callable<Integer, [Integer, Integer]> gi) {
     gi(1,2);
}

の 2 番目の型パラメーターが反変であるため、 は[Integer, Integer]に割り当て可能で[Integer]あり、したがってCallable<Integer, [Integer]>は に割り当て可能であるため、上記の例は問題ありません。Callable<Integer, [Integer, Integer]>Callable

于 2016-12-29T06:00:43.837 に答える
1

Callable<Integer, Nothing>あなたが言ったように、それはすべてのタイプのサブタイプだからですAnything[]Nothingしかし、そのような関数は のインスタンスを予期していて、Nothingそのようなインスタンスが存在しないため、呼び出すことはできません。

を行うことができます。これは型チェッカーを喜ばせますが、もちろん、存在できないもののプレースホルダーであるapply(i2(), nothing)ため、実行時に爆発するだけです。nothing

于 2016-12-29T06:06:39.753 に答える