8

別の質問に触発されました。

fastutilライブラリにはIntArrayList、次の Java シグネチャを持つメソッドを持つクラスがあります。

public void push(Integer o)

Kotlinからは次のように見られます

push(o: Int)

Intプラットフォーム タイプではなく、特定の理由はありますInt!か?

push(o: Int!)少なくとも、Kotlin ソースを含むプロジェクト内の Java ソースで定義された同じシグネチャを持つメソッドが、KotlinInt!から見たパラメーター型として (別のモジュールで定義されていても、そのモジュールの jar からインポートされていても!) あるため、そうなると予想していました。

また、説明されている動作は、合法的にパラメーターを持つ (同じクラス内の) とpush(Integer o)競合します - それらは両方とも と見なされます。forがあった場合、競合はありません (コードでこのメソッドのペアを定義しようとしましたが、期待どおりに動作します。 があります)。push(int o)Intpush(o: Int)Int!IntegerInt!


Kotlin のバージョンは1.0.2.

の Gradle 依存関係fastutil:

compile group: 'it.unimi.dsi', name: 'fastutil', version: '7.0.12'
4

1 に答える 1

10

kotlin コンパイラのバグだと思います。IntStackここでの問題は、によって実装されるインターフェースにありますIntArrayList:

interface Stack<T> {
    void push(T t);
}

interface IntStack extends Stack<Integer> {
    void push(int i);
}

Kotlin はpush(Int)interfaceIntStackのメソッドを 1 つしか認識していません。より正確には、kotlin はそれpush(int i)が method のオーバーライドであると誤って想定していますpush(T t)

于 2016-06-04T10:49:45.343 に答える