#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 /