5,0 освобождении J2SE включает в себя первый набор значимых на уровне языка изменений в платформу Java через некоторое время. В дополнение к новой конструкции для таких вещей, как для повышения цикл и переменную Списки аргументов, J2SE 5.0 обеспечивает безопасность компиляции Тип с рамками Java коллекций через непатентованных лекарственных средств в соответствии с JSR-14: Добавить родовых типов для языка программирования Java.
Одна из главных использует обобщения для абстрактных типов данных при работе с коллекциями. До JDK 5.0 релиз, когда вы создали коллекцию, вы можете положить все в нем, например:
|
Если вы хотите ограничить вашу коллекцию к определенному типу, трудно было в лучшем случае. Получение предметов из коллекции необходимо использовать литье эксплуатацию:
|
Если вы случайно бросил неправильного типа, программа будет успешной компиляции, а исключение будет брошено во время выполнения. Если у вас конкретно касается все, что в коллекции как объекта, литье обычно произошло слепой — или делать экземпляром проверить перед вызовом литыми операции.
|
Эта ситуация подчеркивает красоту генериков. Обобщения позволяет указать, во время компиляции, типы объектов, вы хотите сохранить в коллекции. Затем, когда вы получите и добавить элементы из списка, список уже знает, что, как предполагается типы объектов, которые будут выполнены. Таким образом, вы не должны бросить все. "<>" Символы используются для обозначения какого типа должен быть сохранен. При условии, что тот тип данных, во время компиляции генерируется исключение. Например, если попытаться обобщить следующих классов:
|
Вы получите сообщение об ошибке типа этого:
First.java:7: cannot find symbol symbol : method add(java.lang.String) location: interface java.util.ListmyList.add("Hello, World"); ^ 1 error
Это сообщение основном говорит, что нет Добавить (String) доступный метод, когда интерфейс для списка объектов Integer. MyList.add (10); метода сделал добавить объект целым числом 10 в список. Autoboxing превратили Int тип Integer. Это только добавления строки в список объектов, которые не Целое здесь.
Если вы работаете с элементами коллекции и явно не указать тип элемента в этой коллекции, вы предупредили о том, что слишком. Например, следующая программа создает список, но не уточняется, какого типа будут храниться в список:
|
При компиляции программы, Вы получите следующее предупреждение:
Note: Second.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Да, это предупреждение. Если вы затем следуйте указаниям, и Add-Xlint: Неограниченный к Javac командной строки:
javac -Xlint:unchecked Second.java
Вы увидите следующую дополнительную информацию:
Second.java:6: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.List list.add(10); ^
Сообщение означает, что тип элемента добавляется в список, "Е" в "Добавить (Е)" вызов, никогда не было указано. Сообщение является предупреждением, хотя, поэтому была создана. Файле класса.
Если вы хотите избавиться от предупреждения, вы можете добавить
|
Здесь объектом является Е, и в основном говорит, что все, что могут быть сохранены в перечне.
Откуда приходят по электронной хоть? Если вы посмотрите на границе декларацию java.util.List, вы увидите следующее:
|
Это буквально говорит, что это объявление Список E's.
Позже в определении интерфейса, вы видите методы где аргумент типа возврата или замены Е:
|
Поскольку E задается во время компиляции, Вам не придется полагаться на время выполнения исключением найти несоответствия типов. ? В addAll линию можно рассматривать как совокупность неизвестных, но неизвестные бы Е или подклассу. Эта конструкция позволяет работать с коллекциями подклассов, а не только точных совпадений.
Хотя и не полностью изучены в первом примере, генерики обычно используется с улучшенной цикла, с итератор. Без препаратов-генериков, цикл по списку объектов String требует подавать каждый элемент извлекается из списка к соответствующему типу. Однако все становится проще с генериков и улучшенный цикл.
Вот старый цикл по списку объектов строк, то есть без использования родовых и улучшенный цикл:
|
Если вы планируете скомпилировать и запустить старый класс, а затем запустить его с строку, например:
java Old Hello
Вы получаете:
Hello / 5
В JDK 5.0, вы можете объединить новый улучшенный цикл построить с генерики для создания программы, которая является независимой от типа безопасно во время компиляции, и является более читабельным и более ремонтопригодны. Вот что надо пройтись список объектов String выглядит, если вы используете генериков и улучшенный цикл:
|
java New Hello Hello / 5
Как показано здесь, обобщения и улучшенный цикл хорошо работают вместе.
Для получения дополнительной информации по родовым, см.:
- Tutorial: Generics in the Java Programming Language (pdf)
- JSR-14: Add Generic Types To The Java Programming Language
- Generics
Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.