Почему параметр 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)
,