Почему int автоматически не преобразовывается в больший long в java?

Рейтинг: 3Ответов: 2Опубликовано: 07.09.2014

Встретился с куском кода, в котором происходит ошибка выполнения:

class Runner { 
    public static void main(String[] args) { 
        Object[] array = new Long[1]; 
        array[0] = 1; 
        System.out.println(array[0]); 
    } 
}

Как написано в объяснения на http://muliver.org, где нашел такой тест: "В данном случае произойдёт ошибка выполнения из-за попытки присвоить объект неверного типа в массив объектов.", но почему не преобразовывается в long?

Ответы

▲ 1

Это проблема имплементации генериков в Java. Массивы не должны быть ковариантны по типу элемента: Long[] не есть Object[] даже если Long есть Object.

Проблема в строчке

Object[] array = new Long[1];

Она, по-хорошему, не должна бы компилироваться.

Если вместо этого написать

Long[] array = new Long[1];

то компилятор совершенно правильно не разрешит присвоение несовместимого типа.

У C#, кстати, та же проблема.

▲ 0

Потому что автоматом преобразовываются в int целочисленные значения переменных.
Нужно явно это делать (преобразовывать), так будет все ок:

array[0] = (long)1;

И так будет тоже ок:

long[] array = new long[1];
array[0] = 1;

В вашем примере используете тип обертку лонга, этот тип ожидает исключительно лонг, а компилятор вам подсовывает инт. Вернее, компилятор подсовывает ему вот такое:

Integer.valueOf(1);