Why is Integer parameter of Java method mapped to Int and not platform type?

五迷三道 提交于 2019-11-27 18:30:53

问题


Inspired by another question.

In fastutil library there's IntArrayList class which has a method with the following Java signature:

public void push(Integer o)

From Kotlin it is seen as

push(o: Int)

Is there a specific reason why it is Int and not platform type Int!?

I expected it to be push(o: Int!) at least because a method with the same signature defined in Java source within the project with Kotlin sources has Int! as parameter type seen from Kotlin (even defined in different module, and even imported from jar of that module!).

Also, the described behavior causes push(Integer o) to conflict with push(int o) (in the same class) which has Int parameter legally -- they are both seen as push(o: Int). If there was Int! for Integer, there would be no conflict (I tried also to define this pair of methods in my code -- still works as I expect, there's Int!).


Kotlin version is 1.0.2.

Gradle dependency for fastutil:

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

回答1:


I suspect that it is a kotlin compiler bug. Problem here is in interface IntStack which is implemented by IntArrayList:

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

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

Kotlin sees only one method push(Int) in interface IntStack, or, more precisely, kotlin wrongly supposes that push(int i) is an override of method push(T t).



来源:https://stackoverflow.com/questions/37625983/why-is-integer-parameter-of-java-method-mapped-to-int-and-not-platform-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!