<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=212.116.99.5&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=212.116.99.5&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/212.116.99.5"/>
		<updated>2026-05-05T20:23:01Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Generics&amp;diff=80919</id>
		<title>Generics</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Generics&amp;diff=80919"/>
				<updated>2021-06-01T11:56:44Z</updated>
		
		<summary type="html">&lt;p&gt;212.116.99.5: /* Проблемы реализации Generics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Generics ==&lt;br /&gt;
&lt;br /&gt;
Начиная с JDK 1.5, в Java появляются новые возможности для программирования. Одним из таких нововведений являются Generics.&lt;br /&gt;
Generics являются аналогией с конструкцией &amp;quot;Шаблонов&amp;quot;(template) в С++, но имеет свои нюансы.&lt;br /&gt;
Generics позволяют абстрагировать множество типов. &lt;br /&gt;
Наиболее распространенными примерами являются Коллекции.&lt;br /&gt;
&lt;br /&gt;
Вот типичное использование такого рода (без Generics):&lt;br /&gt;
&lt;br /&gt;
  1. List myIntList = new LinkedList(); &lt;br /&gt;
  2. myIntList.add(new Integer(0));&lt;br /&gt;
  3. Integer x = '''(Integer)''' myIntList.iterator().next(); &lt;br /&gt;
&lt;br /&gt;
Как правило, программист знает, какие данные должны быть в List'e.&lt;br /&gt;
Тем не менее, стоит обратить особое внимание на Приведение типа ('''&amp;quot;Cast&amp;quot;''') в строчке 3. &lt;br /&gt;
Компилятор может лишь гарантировать, что метод next() вернёт Object,&lt;br /&gt;
но чтобы обеспечить присвоение переменной типа Integer правильным и безопасным, требуется Cast. &lt;br /&gt;
Cast не только создает беспорядки, но дает возможность появление ошибки &amp;quot;Runtime Error&amp;quot; из-за невнимательности программиста.&lt;br /&gt;
&lt;br /&gt;
И появляется такой вопрос: &amp;quot;Как с этим бороться? &amp;quot;&lt;br /&gt;
В частности: &amp;quot;Как же зарезервировать List для определенного типа данных?&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Как раз такую проблему решают Generics. &lt;br /&gt;
&lt;br /&gt;
  1. List'''&amp;lt;Integer&amp;gt;''' myIntList = new LinkedList'''&amp;lt;Integer&amp;gt;'''();&lt;br /&gt;
  2. myIntList.add(new Integer(0)); &lt;br /&gt;
  3. Integer x = myIntList.iterator().next(); &lt;br /&gt;
&lt;br /&gt;
Обратите внимание на объявления типа для переменной myIntList. &lt;br /&gt;
Он указывает на то, что это не просто произвольный List, а List&amp;lt;Integer&amp;gt;.&lt;br /&gt;
Мы говорим, что List является generic-интерфейсом, который принимает параметр типа - в этом случае, Integer.&lt;br /&gt;
Кроме того, необходимо обратить внимание на то, что теперь Cast выполняется в строчке 3 автоматически.&lt;br /&gt;
&lt;br /&gt;
Некоторые могут задуматься, что беспорядок в коде увеличился, но это не так.&lt;br /&gt;
Вместо приведения к Integer в строчке 3, у нас теперь есть Integer в качестве параметра в строчке 1.&lt;br /&gt;
Здесь существенное отличие. Теперь компилятор может проверить этот тип на корректность во время компиляции.&lt;br /&gt;
&lt;br /&gt;
'''И когда мы говорим''', что myIntList объявлен как List&amp;lt;Integer&amp;gt;, это будет '''''справедливо''''' во всем коде и компилятор это гарантирует.&lt;br /&gt;
&lt;br /&gt;
* На заметку:&lt;br /&gt;
Эффект от Generics особенно проявляется в крупных проектах: он улучшает читаемость и надежность кода в целом.&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
* Строгая типизация&lt;br /&gt;
* Единая реализация&lt;br /&gt;
* Отсутствие информации о типе&lt;br /&gt;
&lt;br /&gt;
== Пример реализации Generic-класса == &lt;br /&gt;
&lt;br /&gt;
  public interface List&amp;lt;E&amp;gt; {&lt;br /&gt;
      E get(int i);&lt;br /&gt;
      set(int i, E e);&lt;br /&gt;
      add(E e);&lt;br /&gt;
  &lt;br /&gt;
      Iterator&amp;lt;E&amp;gt; iterator();&lt;br /&gt;
      …&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Для того чтобы использовать класс как Generics, мы должны прописать после имени класса '''&amp;lt;...&amp;gt;''', куда можно подставить любое имя, wildcard и т.д.&lt;br /&gt;
&lt;br /&gt;
После того как было объявлено имя generic-типа его можно использовать как обычный тип внутри метода. И когда в коде будет объявлен, к примеру, List&amp;lt;Integer&amp;gt;, то Е станет Integer для переменной list (как показано ниже).  &lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим чем старая реализация кода отличается от новой:&lt;br /&gt;
&lt;br /&gt;
List&amp;lt;E&amp;gt; ─ список элементов E&lt;br /&gt;
&lt;br /&gt;
'''Раньше''' :&lt;br /&gt;
&lt;br /&gt;
  List list = new List();&lt;br /&gt;
  list.add(new Integer(1));&lt;br /&gt;
  Integer i = (Integer) list.get(0);&lt;br /&gt;
&lt;br /&gt;
'''Теперь''' :&lt;br /&gt;
&lt;br /&gt;
  List&amp;lt;Integer&amp;gt; list = new List&amp;lt;Integer&amp;gt;();&lt;br /&gt;
  list.add(new Integer(1));&lt;br /&gt;
  Integer i = list.get(0);&lt;br /&gt;
&lt;br /&gt;
Как видите, больше не нужно приводить Integer, так как метод get() возвращает ссылку на объект конкретного типа (в данном случае – Integer).&lt;br /&gt;
&lt;br /&gt;
== Несовместимость generic-типов ==&lt;br /&gt;
&lt;br /&gt;
Это одна из самых важных вещей, которую вы должны узнать о Generics &lt;br /&gt;
&lt;br /&gt;
Как говорится: &amp;quot;В бочке мёда есть ложка дегтя&amp;quot;. Для того чтобы сохранить целостности и независимости друг от друга Коллекции, у Generics существует так называемая &amp;quot;Несовместимость generic-типов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* Суть такова: &lt;br /&gt;
&lt;br /&gt;
 Пусть у нас есть тип Foo, который является подтипом Bar, и еще G - наследник Коллекции. &lt;br /&gt;
 То G&amp;lt;Foo&amp;gt; '''не является''' наследником G&amp;lt;Bar&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* '''Пример''':&lt;br /&gt;
  List&amp;lt;Integer&amp;gt; li = new ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt;
  List&amp;lt;Object&amp;gt; lo = li;&lt;br /&gt;
&lt;br /&gt;
Иначе — ошибки&lt;br /&gt;
  lo.add(“hello”);&lt;br /&gt;
  // '''ClassCastException''': String -&amp;gt; int&lt;br /&gt;
  Integer li = lo.get(0);&lt;br /&gt;
&lt;br /&gt;
== Проблемы реализации Generics ==&lt;br /&gt;
&lt;br /&gt;
* Решение 1 - '''Wildcard'''&lt;br /&gt;
Пусть мы захотели написать метод, который берет Collection&amp;lt;Object&amp;gt; и выводит на экран. И мы захотели вызвать dump для Integer. &lt;br /&gt;
&lt;br /&gt;
* '''Проблема'''&lt;br /&gt;
&lt;br /&gt;
  void dump(Collection&amp;lt;Object&amp;gt; c) {&lt;br /&gt;
    for (Iterator&amp;lt;Object&amp;gt; i = c.iterator(); i.hasNext(); ) {&lt;br /&gt;
        Object o = i.next();&lt;br /&gt;
        System.out.println(o);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  List&amp;lt;Object&amp;gt; l; dump(l);&lt;br /&gt;
  List&amp;lt;Integer&amp;gt; l; dump(l); // '''Ошибка'''&lt;br /&gt;
&lt;br /&gt;
В этом примере List&amp;lt;Integer&amp;gt; не может использовать метод dump, так как он не является подтипом List&amp;lt;Object&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Проблема в том что эта реализация кода не эффективна, так как Collection&amp;lt;Object&amp;gt; не является полностью родительской коллекцией всех остальных коллекции, грубо говоря Collection&amp;lt;Object&amp;gt; имеет ограничения.&lt;br /&gt;
&lt;br /&gt;
Для решения этой проблемы используется Wildcard (&amp;quot;?&amp;quot;). Он не имеет ограничения в использовании(то есть имеет соответствие с любым типом) и в этом его плюсы. И теперь, мы можем вызвать dump с любым типом коллекции.&lt;br /&gt;
&lt;br /&gt;
* '''Решение''' &lt;br /&gt;
  void dump(Collection&amp;lt;?&amp;gt; c) {&lt;br /&gt;
    for (Iterator&amp;lt;?&amp;gt; i = c.iterator(); i.hasNext(); ) {&lt;br /&gt;
        Object o = i.next();&lt;br /&gt;
        System.out.println(o);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Решение 2 – '''Bounded Wildcard'''&lt;br /&gt;
Пусть мы захотели написать метод, который рисует List&amp;lt;Shape&amp;gt;. И у Shape есть наследник Circle. &lt;br /&gt;
И мы хотим вызвать draw для Circle.&lt;br /&gt;
&lt;br /&gt;
* '''Проблема''' &lt;br /&gt;
&lt;br /&gt;
  void draw(List&amp;lt;Shape&amp;gt; c) {&lt;br /&gt;
    for (Iterator&amp;lt;Shape&amp;gt; i = c.iterator(); i.hasNext(); ) {&lt;br /&gt;
        Shape s = i.next();&lt;br /&gt;
        s.draw();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  List&amp;lt;Shape&amp;gt; l; draw(l);&lt;br /&gt;
  List&amp;lt;Circle&amp;gt; l; draw(l); // '''Ошибка'''&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что у нас не получится из-за несовместимости типов.&lt;br /&gt;
Предложенное решение используется, если метод который нужно реализовать использовал бы определенный тип и его подтипов. Так называемое &amp;quot;Ограничение сверху&amp;quot;. Для этого нужно вместо &amp;lt;Shape&amp;gt; прописать &amp;lt;? extends Shape&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Решение'''&lt;br /&gt;
&lt;br /&gt;
  void draw(List&amp;lt;? extends Shape&amp;gt; c) {&lt;br /&gt;
    for (Iterator&amp;lt;? extends Shape&amp;gt; i = c.iterator();&lt;br /&gt;
            i.hasNext(); ) {&lt;br /&gt;
        Shape s = i.next();&lt;br /&gt;
        s.draw();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Решение 3 – '''Generic-Метод'''&lt;br /&gt;
&lt;br /&gt;
Пусть вы захотели сделать метод, который берет массив Object и переносить их в коллекцию.&lt;br /&gt;
&lt;br /&gt;
* '''Проблема'''&lt;br /&gt;
  void addAll(Object[] a, Collection&amp;lt;?&amp;gt; c) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; a.length; i++) {&lt;br /&gt;
        c.add(a[i]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  addAll(new String[10], new ArrayList&amp;lt;String&amp;gt;());&lt;br /&gt;
  addAll(new Object[10], new ArrayList&amp;lt;Object&amp;gt;());&lt;br /&gt;
  addAll(new Object[10], new ArrayList&amp;lt;String&amp;gt;()); // '''Ошибка'''&lt;br /&gt;
  addAll(new String[10], new ArrayList&amp;lt;Object&amp;gt;()); // '''Ошибка'''&lt;br /&gt;
&lt;br /&gt;
Напомним, что вы не можете просто засунуть Object в коллекции неизвестного типа. Способ решения этой проблемы является использование &amp;quot;Generic-Метод&amp;quot; Для этого перед методом нужно объявить &amp;lt;T&amp;gt; и использовать его.&lt;br /&gt;
&lt;br /&gt;
* '''Решение'''  &lt;br /&gt;
  &amp;lt;T&amp;gt; void addAll(T[] a, Collection&amp;lt;T&amp;gt; c) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; a.length; i++) {&lt;br /&gt;
        c.add(a[i]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
Но все равно после выполнение останется ошибка в третьей строчке :&lt;br /&gt;
  addAll(new Object[10], new ArrayList&amp;lt;String&amp;gt;()); // '''Ошибка'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Решение 4 – '''Bounded type argument'''&lt;br /&gt;
Реализуем метод копирование из одной коллекции в другую&lt;br /&gt;
&lt;br /&gt;
* '''Проблема'''&lt;br /&gt;
 &amp;lt;M&amp;gt; void addAll(Collection&amp;lt;M&amp;gt; c, Collection&amp;lt;M&amp;gt; c2) {&lt;br /&gt;
  for (Iterator&amp;lt;M&amp;gt; i = c.iterator(); i.hasNext(); ) {&lt;br /&gt;
   M o = i.next();&lt;br /&gt;
   c2.add(o);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 addAll(new AL&amp;lt;Integer&amp;gt;(), new AL&amp;lt;Integer&amp;gt;());&lt;br /&gt;
 addAll(new AL&amp;lt;Integer&amp;gt;(), new AL&amp;lt;Object&amp;gt;()); //Ошибка&lt;br /&gt;
&lt;br /&gt;
Проблема в том что две Коллекции могут быть разных типов (несовместимость generic-типов). Для таких случаев было придуман Bounded type argument. Он нужен если метод ,который мы пишем использовал бы определенный тип данных. Для этого нужно ввести &amp;lt;N extends M&amp;gt; (N принимает только значения M).&lt;br /&gt;
Также можно корректно писать &amp;lt;T extends A &amp;amp; B &amp;amp; C&amp;gt;. (Принимает значения нескольких переменных)&lt;br /&gt;
&lt;br /&gt;
* '''Решение'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;M, N extends M&amp;gt; void addAll(Collection&amp;lt;N&amp;gt; c, Collection&amp;lt;M&amp;gt; c2) {&lt;br /&gt;
  for (Iterator&amp;lt;N&amp;gt; i = c.iterator(); i.hasNext(); ) {&lt;br /&gt;
   N o = i.next();&lt;br /&gt;
   c2.add(o);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* Решение 5 – '''Lower bounded wcard'''&lt;br /&gt;
Реализуем метод нахождение максимума в коллекции.&lt;br /&gt;
&lt;br /&gt;
* '''Проблема'''&lt;br /&gt;
 &amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt;&lt;br /&gt;
   T max(Collection&amp;lt;T&amp;gt; c) {&lt;br /&gt;
    …&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
 List&amp;lt;Integer&amp;gt; il; Integer I = max(il);&lt;br /&gt;
 class Test implements Comparable&amp;lt;Object&amp;gt; {…} &lt;br /&gt;
 List&amp;lt;Test&amp;gt; tl; Test t = max(tl); // Ошибка&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt; обозначает что Т обязан реализовывать интерфейс Comparable&amp;lt;T&amp;gt;. &lt;br /&gt;
Ошибка возникает из за того что Test реализует интерфейс Comparable&amp;lt;Object&amp;gt;. Решение этой проблемы - Lower bounded wcard(&amp;quot;Ограничение снизу&amp;quot;). Суть в том что мы будет реализовывать метод не только для Т, но и для его Супер-типов(Родительских типов). &lt;br /&gt;
Например: Если мы напишем &lt;br /&gt;
&lt;br /&gt;
 List&amp;lt;T super Integer&amp;gt; list;&lt;br /&gt;
&lt;br /&gt;
Мы можем заполнить его List&amp;lt;Integer&amp;gt;, List&amp;lt;Number&amp;gt; или List&amp;lt;Object&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
* '''Решение'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;T extends Comparable&amp;lt;? super T&amp;gt;&amp;gt;&lt;br /&gt;
  T max(Collection&amp;lt;T&amp;gt; c) {&lt;br /&gt;
      …&lt;br /&gt;
  }&lt;br /&gt;
----&lt;br /&gt;
* Решение 6 – '''Wildcard Capture'''&lt;br /&gt;
Реализуем метод Swap в List&amp;lt;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Проблема'''&lt;br /&gt;
&lt;br /&gt;
 void swap(List&amp;lt;?&amp;gt; list, int i, int j) {&lt;br /&gt;
     list.set(i, list.get(j)); // Ошибка&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что метод List.set() не может работать с List&amp;lt;?&amp;gt;, так как ему не известно какой он List. Для решение этой проблемы используют &amp;quot;Wildcard Capture&amp;quot; (или &amp;quot;Capture helpers&amp;quot;). Суть заключается в том, чтобы обмануть компилятор. Напишем еще один метод с параметризованной переменной и будем его использовать внутри нашего метода. &lt;br /&gt;
&lt;br /&gt;
* '''Решение'''&lt;br /&gt;
&lt;br /&gt;
 void swap(List&amp;lt;?&amp;gt; list, int i, int j) {&lt;br /&gt;
     swapImpl(list, i, j);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;T&amp;gt; void swapImpl(List&amp;lt;T&amp;gt; list, int i, int j) {&lt;br /&gt;
     T temp = list.get(i);&lt;br /&gt;
     list.set(i, list.get(j));&lt;br /&gt;
     list.set(j, temp);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ограничения Generic ==&lt;br /&gt;
Также нужно запомнить простые правила для работы с Generics.&lt;br /&gt;
&lt;br /&gt;
* Невозможно создать массив параметра типа&lt;br /&gt;
 Collection&amp;lt;T&amp;gt; c;&lt;br /&gt;
 T[] ta;&lt;br /&gt;
 new T[10]; // Ошибка !!&lt;br /&gt;
&lt;br /&gt;
* Невозможно создать массив Generic-классов&lt;br /&gt;
 new ArrayList&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt;();&lt;br /&gt;
 List&amp;lt;?&amp;gt;[] la = new List&amp;lt;?&amp;gt;[10]; // Ошибка !!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Преобразование типов ==&lt;br /&gt;
В Generics также можно манипулировать с информацией, хранящийся в переменных.&lt;br /&gt;
&lt;br /&gt;
* Уничтожение информации о типе&lt;br /&gt;
&lt;br /&gt;
 List l = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
* Добавление информации о типе&lt;br /&gt;
&lt;br /&gt;
 List&amp;lt;String&amp;gt; l = (List&amp;lt;String&amp;gt;) new ArrayList();&lt;br /&gt;
 List&amp;lt;String&amp;gt; l1 = new ArrayList();&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
* Первый пример:&lt;br /&gt;
 &lt;br /&gt;
 List&amp;lt;String&amp;gt; ls;&lt;br /&gt;
 List&amp;lt;Integer&amp;gt; li;&lt;br /&gt;
 ls.getClass() == li.getClass() // True&lt;br /&gt;
 ls instanceof List // True&lt;br /&gt;
 ls instanceof List&amp;lt;String&amp;gt; // Запрещено&lt;br /&gt;
&lt;br /&gt;
* Второй пример:&lt;br /&gt;
&lt;br /&gt;
Нахождение максимума в Коллекции Integer.&lt;br /&gt;
&lt;br /&gt;
* Без Generics:&lt;br /&gt;
 Collection c;&lt;br /&gt;
 Iterator i = c.iterator();&lt;br /&gt;
 Integer max = '''(Integer)''' i.next();&lt;br /&gt;
 while(i.hasNext()) {&lt;br /&gt;
     Integer next = '''(Integer)''' i.next();&lt;br /&gt;
     if (next.compareTo(max) &amp;gt; 0) {&lt;br /&gt;
         max = next;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* С помощью Generics&lt;br /&gt;
 Collection'''&amp;lt;Integer&amp;gt;''' c;&lt;br /&gt;
 Iterator'''&amp;lt;Integer&amp;gt;''' i = c.iterator();&lt;br /&gt;
 Integer max = i.next();&lt;br /&gt;
 while(i.hasNext()) {&lt;br /&gt;
     Integer next = i.next();&lt;br /&gt;
     if (next.compareTo(max) &amp;gt; 0) {&lt;br /&gt;
         max = next;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
[http://www.kgeorgiy.info/ Сайт Георгия Корнеева]&lt;br /&gt;
&lt;br /&gt;
[http://docs.oracle.com/javase/tutorial/java/generics/ Java tutorial. Generics]&lt;br /&gt;
&lt;br /&gt;
[http://www.kgeorgiy.info/courses/java-intro/slides/pics/generics-tutorial.pdf Generics tutorial]&lt;/div&gt;</summary>
		<author><name>212.116.99.5</name></author>	</entry>

	</feed>