Почему параметр Integer метода Java отображается на Int, а не на тип платформы?

Вдохновлен другим вопросом.

В fastutil библиотека есть IntArrayList класс, у которого есть метод со следующей подписью Java:

public void push(Integer o)

Из Котлина это видно как

push(o: Int)

Есть ли конкретная причина, почему это Int а не тип платформы Int! ?

Я ожидал, что это будет push(o: Int!) хотя бы потому, что метод с той же сигнатурой, определенной в источнике Java в проекте с источниками Kotlin, имеет Int! как тип параметра, видимый из Kotlin (даже определенный в другом модуле и даже импортированный из jar этого модуля!).

Также описанное поведение вызывает push(Integer o) конфликтовать с push(int o) (в том же классе), который имеет Int параметр юридически - они оба рассматриваются как push(o: Int), Если бы был Int! за Integer, не было бы никакого конфликта (я попытался также определить эту пару методов в моем коде - все еще работает, как я ожидаю, есть Int!).


Котлин версия есть 1.0.2,

Gradle зависимость для fastutil:

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

1 ответ

Решение

Я подозреваю, что это ошибка компилятора kotlin. Проблема здесь в интерфейсе IntStack который реализуется IntArrayList:

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

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

Котлин видит только один метод push(Int) в интерфейсе IntStackили, точнее, Котлин ошибочно полагает, что push(int i) это переопределение метода push(T t),

Другие вопросы по тегам