2016-06-04 5 views
7

Inspiriert von another question.Warum wird der Integer-Parameter der Java-Methode Int und nicht dem Plattformtyp zugeordnet?

In fastutil Bibliothek gibt es IntArrayList Klasse, die eine Methode mit der folgenden Java-Signatur hat:

public void push(Integer o) 

Von Kotlin ist zu sehen, wie

push(o: Int) 

Gibt es einen bestimmten Grund, warum es Int und nicht Plattformtyp Int!?

I erwartet, dass es push(o: Int!) wenigstens zu sein, weil ein Verfahren mit der gleichen Signatur definiert in Java Quelle innerhalb des Projektes mit Kotlin Quellen Int! als Parametertyp hat von Kotlin gesehen (auch in anderen Modul definiert ist, und sogar aus Glas importiert dieses Moduls!).

Auch das beschriebene Verhalten führt push(Integer o) mit push(int o) (in der gleichen Klasse) in Konflikt, die rechtlich Int Parameter hat - sie sind beide als push(o: Int) gesehen. Wenn es Int! für Integer gäbe, gäbe es keinen Konflikt (ich versuchte auch, dieses Paar Methoden in meinem Code zu definieren - funktioniert immer noch, wie ich erwarte, gibt es Int!).


Die Kotlin-Version ist 1.0.2.

Gradle Abhängigkeit für fastutil:

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

Antwort

9

Ich vermute, dass es sich um ein Kotlin Compiler Bug. Problem hierbei ist, in der durch Schnittstelle IntStackIntArrayList implementiert:

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

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

Kotlin sieht nur eine Methode push(Int) in IntStack Schnittstelle, oder, genauer gesagt, setzt Kotlin fälschlicherweise, dass push(int i) ist eine Überschreibung des Verfahrens push(T t).

+5

Verwandte Problem: https://youtrack.jetbrains.com/issue/KT-11440 – erokhins

Verwandte Themen