разница между int и int[] — автобоксинг внутри дженериков?

#java #generics #autoboxing

#java #дженерики #автобоксинг

Вопрос:

Посмотрите на этот фрагмент кода:

 import java.util.*;
public class Temp{
    public static void main(String[] args){
        List<int[]> list1 = new ArrayList<int[]>(); //WORKS!
        List<double[]> list2 = new ArrayList<double[]>(); //WORKS!
        //List<double> list3 = new ArrayList<double>(); //DOES NOT WORK
        //List<int> list4 = new ArrayList<int>(); //DOES NOT WORK
    }
}
 

AFAIK, дженерики java не поддерживают примитивные типы, тогда как int[] происходит компиляция? Как здесь возможна автобоксинг?

Ответ №1:

int[] и double[] являются ли типы объектов, которые расширяют Object , они не являются примитивами.

Вы не можете автоматически вставлять блоки с массивами. Только между примитивами и их оболочками.

Ответ №2:

Вы можете использовать только ссылочные типы (расширяемые из Object) как общие, поэтому не компилируется с int и double.

Ответ №3:

AFAIK, дженерики java не поддерживают примитивные типы, тогда как int[] компилируется? Как здесь возможна автобоксинг?

Во-первых, int[] и double[] не являются примитивными типами. Это ссылочные типы.

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

  • Здесь значения типа оболочки не используются.
  • Действительно, значения вообще не задействованы. ( int[] это тип, а не значение.)
  • Здесь даже не происходит никакого преобразования на уровне типов.

Все, что существует, — это проверка типа во время компиляции, которая int[] является подтипом Object .

И попытка проверки во время компиляции, которая int является подтипом Object …, завершается неудачей и выдает ошибку компиляции.

Если вам нужен список целых или двойных чисел, вы должны явно использовать классы-оболочки в качестве параметра типа; например List<Integer> , или List<Double> .

Ответ №4:

они являются объектами. вы всегда можете использовать Integer или Double . если вы хотите использовать int, вам следует использовать Trove http://trove.starlight-systems.com /