Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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'
like image 561
hotkey Avatar asked Jun 04 '16 03:06

hotkey


1 Answers

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).

like image 67
erokhins Avatar answered Sep 22 '22 14:09

erokhins