2016-06-04 44 views
7

Ispirato a another question.Perché il parametro Integer del metodo Java è mappato su Int e non sul tipo di piattaforma?

In fastutil biblioteca c'è IntArrayList classe che ha un metodo con la seguente firma Java:

public void push(Integer o) 

Da Kotlin è visto come

push(o: Int) 

C'è una ragione specifica per cui è Int e non il tipo di piattaforma Int!?

ho aspettato che fosse push(o: Int!) almeno perché un metodo con la stessa firma definito nella sorgente Java all'interno del progetto con sorgenti Kotlin ha Int! come tipo di parametro visto da Kotlin (anche definito nel modulo diverso, e anche importata da vaso di quel modulo!).

Inoltre, il comportamento descritto provoca push(Integer o) in contrasto con push(int o) (nella stessa classe) che ha Int parametro legalmente - entrambi sono visti come push(o: Int). Se ci fosse Int! per Integer, non ci sarebbe conflitto (ho provato anche a definire questa coppia di metodi nel mio codice - funziona ancora come mi aspetto, c'è Int!).


La versione di Kotlin è 1.0.2.

Gradle dipendenza per fastutil:

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

risposta

9

ho il sospetto che si tratta di un bug Kotlin compilatore. Problema ecco nell'interfaccia IntStack che viene realizzato tramite IntArrayList:

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

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

Kotlin vede solo metodo push(Int) nell'interfaccia IntStack, o, più precisamente, Kotlin suppone erroneamente che push(int i) è un override del metodo push(T t).

+5

Problema correlato: https://youtrack.jetbrains.com/issue/KT-11440 – erokhins