
- •Нововведения Java 5.0.
- •Цели занятия
- •Статический импорт
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Аргументы переменной длины
- •Аргументы переменной длины
- •Особенности переменного
- •Настраиваемые типы (generic)
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвол с ограничениями
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ошибки неоднозначности
- •Улучшенный цикл for(For-each)
- •Работа улучшенного цикла for
- •Обработка многомерных
- •Вывод
- •Перечислимые типы
- •Перечислимые типы
- •Замечания:
- •Метаданные
- •Метаданные
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Аннотации-маркеры
- •Одночленные аннотации
- •Одночленные аннотации
- •Одночленные аннотации
- •Встроенные аннотации
- •Встроенные аннотации
- •Литература

Ограниченные типы
21Пример 3
//Эти строки не будут компилироваться,так как String
//не является подклассом суперкласса Number
// String strs[] = { "1", "2", "3", "4", "5" };
//Stats<String> strob = new Stats<String>(strs);
//double x = strob.average() ;
//System.out.printlnf"strob average is " + v);
}
}
Результат: Average is 3.0 Average is 3.3
•Как имя типа может быть указан интерфейс
•Как имя типа может быть указан ранее введенный параметр
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метасимвольный аргумент
22 Пример 4
boolean sameAvg(Stats<T> ob) { if ((average) == ob.average())
return true; return false;
}
•К сожалению, приведенный пример будет обрабатывать только те объекты класса Stats, у которых тип такой же, как у объекта, вызвавшего метод
•Например, если метод вызывает объект типа Stats<Integer>, параметр ob должен тоже быть
типа Stats<Integer>
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метасимвольный аргумент
23• Для создания универсального метода вы должны использовать другую функциональную возможность средств настройки типов —
метасимвольный аргумент, или символьную маску
•Метасимвольный аргумент задается знаком ? и представляет неизвестный тип
Пример 5
boolean sameAvg(Stats<?> ob) { if ((average) == ob.average())
return true; return false;
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метасимвольный аргумент
24• Важно понять, что метасимвол не влияет
на тип создаваемого объекта класса Stats
•Тип определяется ключевым словом extends в объявлении класса Stats
•Метасимвол, или маска, обеспечивает совместимость любых допустимых объектов типа Stats
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метасимвол с ограничениями
25 • Ограниченный метасимвол, или маска, задает как верхнюю, так и нижнюю границы аргумента типа
•Это позволяет ограничить набор типов объектов,
которые будут обрабатываться методом
•Ограничение сверху <? extends super>
Оно констатирует, что маска ? соответствует типу super
и любому производному от него классу
Тип super допускается
•Ограничение снизу <? super sub>
В этом случае, допустимыми аргументами считаются
только суперклассы класса, заданного как sub
Тип sub не допускается
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Настраиваемые методы
26 • Как было показано ранее, методы в настраиваемых классах могут использовать параметр типа и таким образом автоматически становятся настраиваемыми по отношению к этому параметру типа
•Однако можно и объявить настраиваемый метод с одним или несколькими собственными параметрами типа
•Более того, есть возможность создать настраиваемый метод внутри ненастраиваемого класса
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Настраиваемые методы
27Пример 6
class GenMethDemo {
// Определяет, является ли объект элементом
массива
static <T, V extends T> boolean isIn(T x, V[] y) { for(int i=0; i < y.length; i++)
if(x.equals(y[i])) return true; return false;
}
public static void main(String args[]) {
// Использует метод isin() для объектов типа Integer Integer nums[] = { 1, 2, 3, 4, 5 };
if(isIn(2, nums))
System.out.println("2 is in nums");
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Настраиваемые методы
28 Пример 6
if(!isIn(7, nums))
System.out.println("7 is not in nums"); System.out.println();
// Использует метод isIn() для объектов типа String String strs[] = { "one", "two", "three", "four", "five" };
if(isIn("two", strs)) System.out.println("two is in strs");
if(!isIn("seven", strs)) System.out.println("seven is not in strs");
//He откомпилируется, поскольку типы не совместимы
//if(isln("two", nums})
//System.out.println("two is in strs”);
}}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Настраиваемые методы
29 Результат:
2 is in nums
7 is not in nums two is in strs seven is not in strs
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Настраиваемые методы
30• Далее приведена синтаксическая запись для настраиваемого метода:
<type-param-list> ret-type meth-
name(param-list) { //...
•type-param-list всегда представляет собой разделенный запятыми список параметров типа
•Обратите внимание на то, что у настраиваемых методов этот список предшествует типу значения, возвращаемого методом
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |