2012-02-24 2 views
1

Поддерживает ли java JDK 6 старые не общие коллекции или будет ли он разорвать существующий код во время выполнения?Предоставляет ли Java JDK 6 не общий код устаревшего кода?

Если он поддерживает его, вам нужно включить его?

Так, например:

List<Integer> list = new ArrayList<Integer>(); 
list.add(5); 

Alpha a = new Alpha(); 
a.insert(list); 

for (Integer integer : list) { 
    System.out.println(integer); 
} 

необщего (устаревший код):

public class Alpha { 
    public void insert(List list) { 
    list.add(new String("50")); 
    } 
} 

компилируется нормально, но перерывы во время выполнения. Я думал, что все будет нормально, и компилятор просто предупредит вас.

+0

Компилятор не предупредит вас, если вы не используете дженерики. Период. – BalusC

+0

Итак, Java 6 не совместим с устаревшим кодом? –

+2

Я этого не говорил. Java 6 определенно совместим с устаревшим кодом. Он не будет предупреждать при использовании неправильных сырых типов во время компиляции. У вас была бы такая же проблема в старых версиях Java, если вы не используете дженерики. – BalusC

ответ

4

Generics sort-of существует только во время компиляции. (Не совсем, все равно метаданные повсюду, но сами типы объектов не затронуты, и в частности массив, поддерживающий ArrayList, по-прежнему будет Object[]. Это очень важно здесь.) Вы можете всегда использовать общий типа, как если бы это был не общий тип - компилятор предупредит вас, но сам класс не может помешать вам это сделать.

Ваш код ломается, потому что вы неявно литье каждый элемент массива Integer здесь:

for (Integer integer : list) { 
    System.out.println(integer); 
} 

Как бы вы ожидать, что будет обрабатываться в исполнении времени? Чтобы было ясно, скомпилированный код примерно эквивалентно:

for (Iterator iterator = list.iterator(); iterator.hasNext();) { 
    Integer integer = (Integer) list.next(); 
    System.out.println(integer); 
} 

Представьте, что вы находитесь в мире без дженериков, и думать, что это будет делать, если вы получили в списке на String (как, впрочем, у вас есть , благодаря Alpha). Точно такая же вещь (a ClassCastException) произойдет с дженерики.

+0

Да, я понял. Спасибо –

+0

Yup, я получил это, хорошее объяснение. Я пошел в joel spolsky talk in london о Stackoverflow, о котором вы упоминали как великого вкладчика в сообщество им теперь, я знаю почему. :) –

+0

@nakul: Боюсь, я не понимаю вашего комментария. Я подозреваю, что вам лучше попросить новый вопрос быть честным. –

2

Компилятор предупредит вас об этом.

Запустить javac с опцией -Xlint для получения полной информации.

предупреждение: [снят] бесконтрольно вызова, чтобы добавить (E) в качестве члена сырьевого типа java.util.List list.add (новая строка ("50"));

Если вы хотите использовать нетипизированный список (сырье типа), то просто создать один, используя подобный унаследованный код:

List list = new ArrayList(); 

но ваш код будет по-прежнему не во время выполнения, когда вы приводите строку, которую вы добавили к List to Integer.

+0

Yup я получил его, я не знал о -Xlint, спасибо, что упомянул об этом. –

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