Автор Анна Ивницкая
Обобщения (generics) - это параметризированные типы.
class Box { private Object item; public void setItem (Object o) { item = o; } public Object getItem () { return item; } }
public class Test { public static void main(String[] args) { Box box = new Box(); box.setItem("hello"); String str1 = (String)box.getItem(); System.out.println(str1); } }
Результат выполнения: hello
class Box { private Object item; public void setItem (Object o) { item = o; } public Object getItem () { return item; } }
public class Test { public static void main(String[] args) { Box box = new Box(); box.setItem("hello"); Integer int1 = (Integer)box.getItem();//Exception System.out.println(int1); } }Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
class Box<T> { private T item; public void setItem (T o) { item = o; } public T getItem () { return item; } }
public class Test { public static void main(String[] args) { Box<String> box = new Box<String>(); box.setItem("hello"); String str1 = box.getItem(); System.out.println(str1); } }
Результат выполнения: hello
Ошибка компиляции
class Box<T> { private T item; public void setItem (T o) { item = o; } public T getItem () { return item; } }
public class Test { public static void main(String[] args) { Box<String> box = new Box<String>(); box.setItem(1234567);//Exception String str1 = box.getItem(); System.out.println(str1); } }Compilation completed with 1 error Error: java: incompatible types: int cannot be converted to java.lang.String
Обобщения действуют только со ссылочными типами
Box<int> box = new Box<int>(); //Error!
Обобщенный класс с двумя параметрами типа
class Box<T, V> { private T item; private V item2; public Box(T o, V o2) { item = o; item2 = o2; } }
Ограничение сверху
class Box <T extends Number>{ private T item; public void setItem (T o) { item = o; } public Integer getIntValue () { return item.intValue(); } }
public class Test { public static void main(String[] args) { Box<Float> box = new Box<>(); box.setItem(123.45F); Integer int1 = box.getIntValue(); System.out.println(int1); } }
class Box<Т> {} class Human { public void useBox(Box<?> box) {} }
public class Test { public static void main(String[] args) { Box<String> stringBox = new Box<>(); Box<Number> numberBox = new Box<>(); Human human = new Human(); human.useBox(stringBox); human.useBox(numberBox); } }
interface Box<Т> { setItem(T item); } class BoxImpl implements Box<String> { public void setItem(String item) {} }
public class Test { public static void main(String[] args) { Box<String> stringBox = new BoxImpl<>(); stringBox.setItem("Hello World"); } }
class Box<Т> { public void setItem (T item) {} } class BigBox<K, T> extends Box<T> { public void setBigItems(K item, T item2) {} }
public class Test { public static void main(String[] args) { BigBox<String, Integer> stringBox = new BigBox<>(); stringBox.setItem("Very big item", 23); } }
class Box<Т> { private T item; public void setItem (T item) { this.item = item; } public T getItem() { return item; } }
public class Test { public static void main(String[] args) { Box box = new Box(); box.setItem("string"); String str = (String)box.getItem(); } }