Михаил
Павлов
Обобщения:
Для чего нужны
Как с ними работать
Что такое raw type и wildcard
Optional
Коллекции:
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;
}
}
Обобщения
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();
}
}
Теперь ошибка в момент компиляции
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");
1) Обобщение в обозначении класса
2) Обобщение в методе
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");
List list = new ArrayList();
Написать так
List<String> list = new ArrayList<String>();
Вместо этого
Мы получим обобщение без параметров или сырой тип (raw type)
* Сырые типы оставлены для обратной совместимости
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);
List<String> list2 = list;
for(Iterator<String> itemItr = list2.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<String>();
list.add("First");
list.add("Second");
list.add(10);
List list2 = list;
for(Iterator<String> itemItr = list2.iterator(); itemItr.hasNext();) {
System.out.println(itemItr.next());
}
}
}
Ошибка при компиляции
public static void main(String[] args) {
//Integer List
List<Integer> list1 = Arrays.asList(1,2,3);
//Double list
List<Double> list2 = Arrays.asList(1.1,2.2,3.3);
printlist(list1);
printlist(list2);
}
private static void printlist(List<?> list) {
System.out.println(list);
}
Маска
Не пользуйтесь сырыми типами
Вместо них используйте маски
(wildcards или <?>)
class CommonWriter<T extends Writable> {
private T val;
public CommonWriter(T arg) {
val = arg;
}
public String toString() {
return "{" + val + "}";
}
public <T extends Writable> static void fastWrite(T ob) {
String text = new CommonWriter<T>(ob).toString();
System.out.println(text);
}
}
* При подготовке этой презентации ни один кролик не пострадал
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;
}
* В Java есть много встроенных коллекций для разных ситуаций
(полиморфизм в действии)
Что это дает:
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<String, String>();
capitalCities.put("England", "London");
capitalCities.put("Germany", "Berlin");
capitalCities.put("Norway", "Oslo");
capitalCities.put("USA", "Washington DC");
capitalCities.putIfAbsent("Russia", "Moscow");
for(Map.Entry m : capitalCities.entrySet()){
System.out.println(m.getKey() + " " + m.getValue());
}
HashMap<String, String> newMap = new HashMap<String,String>();
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");
Iterator<String> i = set.iterator();
while(i.hasNext()) {
System.out.println(i.next());
}
}
}
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)
Спойлер следующей лекции
- вы узнаете, что такое NullPointerException
Практика по обобщениям будет в рамках следующего домашнего задания
Сегодня домашнего задания не будет
***