Как использовать дженерики

5,0 освобождении J2SE включает в себя первый набор значимых на уровне языка изменений в платформу Java через некоторое время. В дополнение к новой конструкции для таких вещей, как для повышения цикл и переменную Списки аргументов, J2SE 5.0 обеспечивает безопасность компиляции Тип с рамками Java коллекций через непатентованных лекарственных средств в соответствии с JSR-14: Добавить родовых типов для языка программирования Java.

Одна из главных использует обобщения для абстрактных типов данных при работе с коллекциями. До JDK 5.0 релиз, когда вы создали коллекцию, вы можете положить все в нем, например:


   List myList = new ArrayList(10);

   myList.add(new Integer(10));

   myList.add("Hello, World");

Если вы хотите ограничить вашу коллекцию к определенному типу, трудно было в лучшем случае. Получение предметов из коллекции необходимо использовать литье эксплуатацию:


   Integer myInt = (Integer)myList.iterator().next();

Если вы случайно бросил неправильного типа, программа будет успешной компиляции, а исключение будет брошено во время выполнения. Если у вас конкретно касается все, что в коллекции как объекта, литье обычно произошло слепой — или делать экземпляром проверить перед вызовом литыми операции.


  Iterator listItor = myList.iterator();

  Object myObject = listItor.next();

  Integer myInt = null;

  if (myObject instanceof Integer) {

    myInt = (Integer)myObject;

  }

Эта ситуация подчеркивает красоту генериков. Обобщения позволяет указать, во время компиляции, типы объектов, вы хотите сохранить в коллекции. Затем, когда вы получите и добавить элементы из списка, список уже знает, что, как предполагается типы объектов, которые будут выполнены. Таким образом, вы не должны бросить все. "<>" Символы используются для обозначения какого типа должен быть сохранен. При условии, что тот тип данных, во время компиляции генерируется исключение. Например, если попытаться обобщить следующих классов:


  import java.util.*;



  public class First {

    public static void main(String args[]) {

      List<Integer> myList = new ArrayList<Integer>(10);

      myList.add(10);

      myList.add("Hello, World");

    }

  }

Вы получите сообщение об ошибке типа этого:

First.java:7: cannot find symbol
symbol  : method add(java.lang.String)
location: interface java.util.List
myList.add("Hello, World");
^
1 error

Это сообщение основном говорит, что нет Добавить (String) доступный метод, когда интерфейс для списка объектов Integer. MyList.add (10); метода сделал добавить объект целым числом 10 в список. Autoboxing превратили Int тип Integer. Это только добавления строки в список объектов, которые не Целое здесь.

Если вы работаете с элементами коллекции и явно не указать тип элемента в этой коллекции, вы предупредили о том, что слишком. Например, следующая программа создает список, но не уточняется, какого типа будут храниться в список:


   import java.util.*;



   public class Second {

     public static void main(String args[]) {

       List list = new ArrayList();

       list.add(10);

     }

   }

При компиляции программы, Вы получите следующее предупреждение:

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);
^

Сообщение означает, что тип элемента добавляется в список, "Е" в "Добавить (Е)" вызов, никогда не было указано. Сообщение является предупреждением, хотя, поэтому была создана. Файле класса.

Если вы хотите избавиться от предупреждения, вы можете добавить к списку декларации, а именно:


List<Object> list = new ArrayList<Object>();

Здесь объектом является Е, и в основном говорит, что все, что могут быть сохранены в перечне.

Откуда приходят по электронной хоть? Если вы посмотрите на границе декларацию java.util.List, вы увидите следующее:


   public interface List<E> extends Collection<E>

Это буквально говорит, что это объявление Список E's.

Позже в определении интерфейса, вы видите методы где аргумент типа возврата или замены Е:


   Iterator<E" iterator();

   ListIterator<E" listIterator();

   boolean add(E o);

   boolean addAll(Collection<? extends E" c);

Поскольку E задается во время компиляции, Вам не придется полагаться на время выполнения исключением найти несоответствия типов. ? В addAll линию можно рассматривать как совокупность неизвестных, но неизвестные бы Е или подклассу. Эта конструкция позволяет работать с коллекциями подклассов, а не только точных совпадений.

Хотя и не полностью изучены в первом примере, генерики обычно используется с улучшенной цикла, с итератор. Без препаратов-генериков, цикл по списку объектов String требует подавать каждый элемент извлекается из списка к соответствующему типу. Однако все становится проще с генериков и улучшенный цикл.

Вот старый цикл по списку объектов строк, то есть без использования родовых и улучшенный цикл:


   import java.util.*;



   public class Old {

     public static void main(String args[]) {

       List list = Arrays.asList(args);

       Iterator itor = list.iterator();

       while (itor.hasNext()) {

         String element = (String)itor.next();

         System.out.println(element + " / " + element.length());

       }

     }

   }   

Если вы планируете скомпилировать и запустить старый класс, а затем запустить его с строку, например:

java Old Hello

Вы получаете:

Hello / 5

В JDK 5.0, вы можете объединить новый улучшенный цикл построить с генерики для создания программы, которая является независимой от типа безопасно во время компиляции, и является более читабельным и более ремонтопригодны. Вот что надо пройтись список объектов String выглядит, если вы используете генериков и улучшенный цикл:


   import java.util.*;



   public class New {

     public static void main(String args[]) {

       List<String> list = Arrays.asList(args);

       for (String element : list) {

         System.out.println(element + " / " + element.length());

       }

     }

   }
java New Hello
Hello / 5

Как показано здесь, обобщения и улучшенный цикл хорошо работают вместе.

Для получения дополнительной информации по родовым, см.:

  1. Tutorial: Generics in the Java Programming Language (pdf)
  2. JSR-14: Add Generic Types To The Java Programming Language
  3. Generics

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>