Spec-Zone .ru
спецификации, руководства, описания, API
|
JDK 5.0 представляет несколько новых расширений языка программирования Java. Один из них является введением обобщений.
Этот след является введением в обобщения. Можно быть знакомыми с подобными конструкциями с других языков, наиболее особенно шаблонов C++. Если так, Вы будете видеть, что есть и общие черты и важные различия. Если Вы незнакомы с конструкциями взгляда подобно откуда-либо, тем лучше; можно запустить новый, не имея необходимость разучиваться любые неправильные представления.
Обобщения позволяют Вам краткому обзору по типам. Наиболее распространенными примерами являются контейнерные типы, такие как те в иерархии Наборов.
Вот типичное использование того вида:
List myIntList = new LinkedList(); // 1 myIntList.add(new Integer(0)); // 2 Integer x = (Integer) myIntList.iterator().next(); // 3
Бросок на строке 3 является немного раздражающим. Как правило, программист знает, какие данные были помещены в определенный список. Однако, бросок важен. Компилятор может только гарантировать что Object
будет возвращен iterator. Гарантировать присвоение на переменную типа Integer
безопасно с точки зрения типов, бросок требуется.
Конечно, бросок не только представляет помеху. Это также представляет возможность ошибки периода выполнения, так как программист может ошибиться.
Что, если программисты могли бы фактически выразить свое намерение, и отметить список, как ограничиваемый, чтобы содержать определенный тип данных? Это - центральная идея позади обобщений. Вот версия фрагмента программы, данного выше использования обобщений:
List<Integer> myIntList = new LinkedList<Integer>(); // 1' myIntList.add(new Integer(0)); // 2' Integer x = myIntList.iterator().next(); // 3'
Заметьте описание типа для переменной myIntList
. Это определяет, что это не только произвольное List
, но a List
из Integer
, записанный List<Integer>
. Мы говорим это List
универсальный интерфейс, который берет параметр типа - в этом случае, Integer
. Мы также определяем параметр типа, создавая объект списка.
Отметьте, также, что броска на строке 3' не стало.
Теперь, Вы могли бы думать, что все, что мы выполнили, должно переместить помеху. Вместо броска к Integer
на строке 3, мы имеем Integer
как параметр типа на строке 1'. Однако, здесь есть очень большая разница. Компилятор может теперь проверить правильность типа программы во время компиляции. Когда мы говорим это myIntList
объявляется с типом List<Integer>
, это говорит нам что-то о переменной myIntList
, который сохраняется везде, где и всякий раз, когда это используется, и компилятор гарантирует это. Напротив, бросок говорит нам что-то, что программист думает, истина в единственной точке в коде.
Результирующий эффект, особенно в больших программах, является улучшенной удобочитаемостью и устойчивостью.