2015-06-07 3 views
0

Я не мог найти ответ на этот точный вопрос в другом месте, но прошу прощения, если это дубликат.Java Generics - Инициализация избыточного типа

Я обычно вижу общие инициализации сделано, как это, с параметром типа рядом с ссылочного типа, а как объект декларации:

Box<Integer> integerBox = new Box<Integer>(); 

Или в «стенография» метод (с Java 7), используя алмаз:

Box<Integer> integerBox = new Box<>(); 

Однако я заметил, что код все еще работает после того, как опуская тип параметра рядом с описанием объекта следующим образом:

Box<Integer> integerBox = new Box(); 

Почему? Является ли это некоторой магией компилятора (кстати, я использую NetBeans).

Заранее спасибо.

+0

Здесь вы можете найти отличный ответ на этот общий вопрос. http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 – Sam5487

ответ

1

Это один:

Box<Integer> integerBox = new Box(); 

назначает сырым Box к integerBox, минуя общие проверки типов. Несмотря на то, что может выглядеть хорошо в этом случае, это не так здорово, когда у вас есть что-то вроде

List<String> strings = Arrays.asList("a", "b", "c"); 
... 
List<Integer> integers = new ArrayList(strings); 

Если вы

List<Integer> integers = new ArrayList<>(strings); 

то компилятор обнаружит несоответствие типов.

0

Если вы скомпилируете это, вы получите warning: unchecked conversion. Это означает, что при инициализации integerBox необработанному типу, хотя он был объявлен как общий тип, компилятор все равно будет обходить проверку общего типа.

Смежные вопросы