Similar presentations:
Дженерики. Перечисляемые типы
1.
Курс «Программирование на Java» - Дженерики.Перечисляемые типы
2.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Рассматриваемые вопросы
• Дженерики (Generics)
• Типы дженериков
• Wildcard в дженериках
• Перечисляемые типы (enums)
• Особенности перечисляемых типов
3.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Дженерики
Рассмотрим пример
public class Box {
private Object item;
public Box() {
}
public Object getItem() {
return item;
}
public void setItem(Object item) {
this.item = item;
}
}
4.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Дженерики
В результате мы можем получить ошибку
public static void main(String[] args) {
Box box = new Box();
box.setItem(“16”);
//…
Object item = box.getItem();
Integer item1 = (Integer) item;
}
Exception in thread "main" java.lang.ClassCastException:
class java.lang.String cannot be cast to class java.lang.Integer
5.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Дженерики
Чтобы избежать подобной ситуации еще на этапе компиляции можем воспользоваться типизацией
public class Box<T> {
private T item;
public Box() {}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
public static void main(String[] args) {
Box<String> box = new Box<>();
box.setItem("16");
String item = box.getItem();
}
}
6.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Дженерики
Дженерики также могут быть локальными
public class Box<T> {
private T item;
public Box() { }
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
public static <K extends Number> String doSmth(K value, String strValue) {
return value.intValue() + " " + strValue;
}
}
7.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Дженерики
Дженерики работают только со ссылочными типами и не работают с примитивными типами
// Правильные варианты
Box<String> box1 = new Box<>();
Box<Integer> box2 = new Box<Integer>();
Box<Long> box3 = new Box<>();
Box<Day> box4 = new Box<>();
//невозможные варианты
Box<int> box5 = new Box<>();
Box<long> box6 = new Box<>();
8.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Wildcard в дженериках
Чтобы ограничить использование различных типов используют wildcard extends для дженерики
class NumberBox<T extends Number> {
private T item;
public T getItem() { return item; }
}
class CharBox<T extends CharSequence> {
private T item;
public T getItem() { return item; }
}
public static void main(String[] args) {
NumberBox<BigDecimal> decimalBox = new NumberBox<>();
NumberBox<Long> longBox = new NumberBox<>();
CharBox<String> stringBox = new CharBox<>();
}
9.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Wildcard в аргументах
методов
Чтобы гарантировать безопасность типов используют wildcard для аргументов методов:
“?”, “? extends …”, “? super …”
class NumberBox<T extends Number> {
private T item;
public T getItem() {
return item;
}
public void print(NumberBox<?> box) {
System.out.println(box);
}
public void printWithInt(NumberBox<? extends Integer> box) {
System.out.println(box);
}
}
10.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Перечисляемые типы
Enum - это тип, поля которого состоят из конечного набора констант
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
11.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Перечисляемые типы
Пример использования enum в коде
Day day = Day.MONDAY;
switch (day) {
case MONDAY:
System.out.println(day.name() + " is first working day");
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
System.out.println(day.name() + " is workday");
break;
case FRIDAY:
System.out.println("Thanks God it's " + day.name());
case SATURDAY:
case SUNDAY:
System.out.println(day.name() + " is weekend");
break;
}
12.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Особенности перечисляемых типов
Перечисляемый тип наследуется от класса java.lang.Enum
Day currentDay = Day.FRIDAY;
System.out.println("currentDay.name() => " + currentDay.name());
System.out.println("currentDay.toString() => " + currentDay.toString());
System.out.println("currentDay.ordinal() => " + currentDay.ordinal());
// получение всех элементов перечисления
System.out.println(Arrays.toString(currentDay.values()));
// получение экземпляра объекта enum по строковому представлению
System.out.println(currentDay.equals(Day.valueOf("FRIDAY")));
//———————— Вывод ————————
currentDay.name() => FRIDAY
currentDay.toString() => FRIDAY
currentDay.ordinal() => 4
[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
true
13.
Курс «Программирование на Java» - Дженерики. Перечисляемые типыТренер: Наруть Андрей Михайлович
Особенности перечисляемых
типов
Как и обычный класс может содержать поля, методы и конструкторы
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,
SATURDAY(false), SUNDAY(false);
private boolean isWorkingDay;
Day(boolean isWorkingDay) {
this.isWorkingDay = isWorkingDay;
}
Day() {
this(true);
}
public boolean isWorkingDay() {
return isWorkingDay;
}
}