Павлов Михаил
https://www.youtube.com/playlist?list=PLmEQRj1_Mt5f5MlXGlf5kzldb9Rl8Pwuo
Михаил
Павлов
1) Обобщения (generics):
Для чего нужны
Как с ними работать
2) Коллекции:
3) Что такое raw types и wildcard
class CommonIntegerWriter {
private Integer val;
public CommonIntegerWriter(Integer arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public Integer getValue() {
return val;
}
}
class CommonBooleanWriter {
private Boolean val;
public CommonBooleanWriter(Boolean arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public Boolean getValue() {
return val;
}
}
class CommonBigDecimalWriter {
private BigDecimal val;
public CommonBigDecimalWriter(BigDecimal arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public BigDecimal getValue() {
return val;
}
}
Метод | Описание |
---|---|
|
Позволяет сравнивать 2 объекта |
|
Возвращает тип (класс) экземпляра объекта |
|
Возвращает хэш-код, используемый для поиска в коллекциях |
|
Позволяет преобразовывать объект в строку |
boolean equals( Object o );
Class getClass();
int hashCode();
String toString();
class CommonWriter {
private Object val;
public CommonWriter(Object arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public Object getValue() {
return val;
}
}
public class Test {
public static void main(String[] args) {
CommonWriter value1 = new CommonWriter(new Integer(10));
System.out.println(value1);
Integer intValue1 = (Integer) value1.getValue();
CommonWriter value2 = new CommonWriter("Hello world");
System.out.println(value2);
Integer intValue2 = (Integer) value2.getValue();
}
}
Ошибка приведения типа в рантайме
Обобщения - это параметризированные типы
С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра
class CommonWriter<T> {
private T val;
public CommonWriter(T arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public T getValue() {
return val;
}
}
CommonWriter<String> value2 = new CommonWriter<String>("Hello world");
Обобщения
public class Test {
public static void main(String[] args) {
CommonWriter<Integer> value1 = new CommonWriter<Integer>(new Integer(10));
System.out.println(value1);
Integer intValue1 = value1.getValue();
CommonWriter<String> value2 = new CommonWriter<String>("Hello world");
System.out.println(value2);
Integer intValue2 = value2.getValue();
}
}
Теперь ошибка в момент компиляции
CommonWriter<String> value2 = new CommonWriter<String>("Hello world");
CommonWriter<String> value2 = new CommonWriter<>("Hello world");
Алмазный синтаксис:
Обычный синтаксис:
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
public class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
Pair<String, Integer> p1 = new OrderedPair<>("Even", 8);
Pair<String, String> p2 = new OrderedPair<>("hello", "world");
abstract class Animal {
public void move() {};
}
class Cat extends Animal {
public void move() { System.out.println("RUN");}
}
class Eagle extends Animal {
public void move() { System.out.println("FLY");}
}
public <T extends Animal> void inDanger(T animal) {
animal.move();
}
* При подготовке этой презентации ни один кролик не пострадал
public static <E> boolean containsElement(E [] elements, E element){
for (E e : elements){
if(e.equals(element)){
return true;
}
}
return false;
}
public static boolean containsElement(Object [] elements, Object element){
for (Object e : elements){
if(e.equals(element)){
return true;
}
}
return false;
}
1) Обобщения (generics):
Для чего нужны
Как с ними работать
2) Коллекции:
3) Что такое raw types и wildcard
Коллекции облегчают работу со множествами (объектов)
* В Java есть много встроенных коллекций для разных ситуаций
(полиморфизм в действии)
Что это дает:
ArrayList
LinkedList
import java.util.*;
public class MyApplication {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1,2,3);
List<String> list2 = new ArrayList();
list2.add("Hello");
list2.add("world");
}
}
(метод hashCode у Object)
import java.util.*;
public class MyApplication {
public static void main(String[] args) {
HashMap<String, String> capitalCities = new HashMap<>();
capitalCities.put("England", "London");
capitalCities.put("Germany", "Berlin");
capitalCities.put("Norway", "Oslo");
capitalCities.put("USA", "Washington DC");
capitalCities.putIfAbsent("Russia", "Moscow");
for(Map.Entry<String, String> m : capitalCities.entrySet()){
System.out.println(m.getKey() + " " + m.getValue());
}
HashMap<String, String> newMap = new HashMap<>();
newMap.put("Spain","Madrid");
newMap.putAll(capitalCities);
}
}
boolean result = setA.containsAll(setB);
setA.addAll(setB);
setA.removeAll(setB);
setA.retainAll(setB);
Важно: Значение уникально
За уникальностью следит Set
У Set ключ является значением
import java.util.*;
public class MyApplication {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("One");
set.add("Two");
set.add("Two");
set.add("Three");
for (String item : set) {
System.out.println(item);
}
}
}
Все коллекции, по умолчанию, мутабельны
Объект считается иммутабельным, если его состояние нельзя изменить после создания
List<String> stringList = Arrays.asList("a", "b", "c");
stringList = Collections.unmodifiableList(stringList);
// Collections.unmodifiableSet
// Collections.unmodifiableMap
Можно создать иммутабельную коллекцию:
1) Обобщения (generics):
Для чего нужны
Как с ними работать
2) Коллекции:
3) Что такое raw types и wildcard
List list = new ArrayList();
Синтаксис
List<String> list = new ArrayList<String>();
Вместо
Или обобщения без параметров
* Сырые типы оставлены для обратной совместимости
import java.util.*;
public class MyApplication {
public static void main(String[] args) {
List list = new ArrayList();
list.add("First");
list.add("Second");
list.add(10);
for(Iterator<String> itemItr = list.iterator(); itemItr.hasNext();) {
System.out.println(itemItr.next());
}
}
}
Снова ошибка в момент выполнения
import java.util.*;
public class MyApplication {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("First");
list.add("Second");
list.add(10);
for(Iterator<String> itemItr = list.iterator(); itemItr.hasNext();) {
System.out.println(itemItr.next());
}
}
}
Ошибка при компиляции
public static void main(String[] args) {
//Double list
List<Double> list2 = Arrays.asList(1.1,2.2,3.3);
//Integer List
List<Integer> list1 = Collections.emptyList();
checkIfEmptyList(list1);
checkIfEmptyList(list2);
}
private static void checkIfEmptyList(List<Object> list) {
if (list.isEmpty()) {
throw new RuntimeException("Ошибка. Передан пустой лист");
}
}
Не работает
Object - родительский класс для Integer,
но Collection<Object> не родитель для Collection<Integer>
public static void main(String[] args) {
//Double list
List<Double> list2 = Arrays.asList(1.1,2.2,3.3);
//Integer List
List<Integer> list1 = Collections.emptyList();
checkIfEmptyList(list1);
checkIfEmptyList(list2);
}
private static void checkIfEmptyList(List<?> list) {
if (list.isEmpty()) {
throw new RuntimeException("Ошибка. Передан пустой лист");
}
}
Использование маски
public <T> static Email sendHomeWork(Homework<T> homework) {
Email result = homework.makeHomework();
return result;
}
java.lang.NullPointerException
at Study.sendHomework (Study.java :2)
at MyApplication.onAfterLection (MyApplication.java :3)
Спойлер следующей лекции:
Практика по обобщениям будет в рамках последующих занятий
Сегодня домашнего задания не будет
By Павлов Михаил
Обобщения и коллекции