public class Obdobi { public static final int JARO = 0; public static final int LÉTO = 1; public static final int PODZIM = 2; public static final int ZIMA = 3; }
public enum Obdobi { JARO, LÉTO, PODZIM, ZIMA; }
public class Jablon { static Obdobi o; public static String cinnost(Obdobi obdobi) { switch (obdobi) { case JARO: return "kvete"; case LÉTO: return "zraje"; case PODZIM: return "plodí"; case ZIMA: return "spí"; default: // Překladač nekontroluje, zda jsme vyčerpali všechny možnosti, a může se chybně // domnívat, že existuje ještě nějaká cesta, kterou jsme nepokryli. throw new IllegalArgumentException("Neočekávaná hodnota parametru období = " + obdobi); } } public static String vyjmenuj() { String s = ""; for (Obdobi obd : Obdobi.values()) { s += obd + " "; } return s; } public static void main(String[] args) { o = Obdobi.PODZIM; // Přístup ke konstantě je skrze název třídy. System.out.println(cinnost(o)); // Vypíše plodí System.out.println(o.name()); // Vypíše PODZIM System.out.println(o.ordinal()); // Vypíše 2 System.out.println(o.toString()); // Vypíše PODZIM System.out.println(vyjmenuj()); // Vypíše JARO LÉTO PODZIM ZIMA } }
public enum Smer8 { VÝCHOD(1, 0, "S", "VYCHOD"), SEVEROVÝCHOD(1, -1, "SV", "SEVEROVYCHOD"), SEVER(0, -1, "S", "SEVER"), SEVEROZÁPAD(-1, -1, "SZ", "SEVEROZAPAD"), ZÁPAD(-1, 0, "Z", "ZAPAD"), JIHOZÁPAD(-1, 1, "JZ", "JIHOZAPAD"), JIH(0, 1, "J", "JIH"), JIHOVÝCHOD(1, 1, "JV", "JIHOVYCHOD"), ŽÁDNÝ(0, 0, "@", "ZADNY"); private int dx, dy; private String zkratkaSmeru, smer; private Smer8(int dx, int dy, String zkratkaSmeru, String smer) { this.dx = dx; this.dy = dy; this.zkratkaSmeru = zkratkaSmeru; this.smer = smer; } public double delkaPosunu() { return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); } }
public class Posun { public static void main(String[] args) { Smer8 smer = Smer8.SEVER; System.out.println(smer.delkaPosunu()); // Vypíše 1 smer = Smer8.JIHOVÝCHOD; System.out.println(smer.delkaPosunu()); // Vypíše 1.4142135623730951 System.out.println(smer.name()); // Vypíše JIHOVÝCHOD System.out.println(smer.ordinal()); // Vypíše 7 System.out.println(smer.toString()); // Vypíše JIHOVÝCHOD. Tuto metodu lze (jako jednu z mála) v enumeraci překrýt. } }
public enum Operator { SOUČET('+') { @Override double proved(double x, double y) { return x + y; } }, ROZDÍL('-') { @Override double proved(double x, double y) { return x - y; } }, SOUČIN('×') { @Override double proved(double x, double y) { return x * y; } }, PODÍL(':') { @Override double proved(double x, double y) { return x / y; } }, MOCNĚNÍ('^') { @Override double proved(double x, double y) { return Math.pow(x, y); } }, ODMOCNĚNÍ('\u221A') { //Znak pro odmocninu @Override double proved(double x, double y) { return Math.pow(y, 1 / x); } }; private final char znak; private Operator(char znak) { this.znak = znak; } @Override public String toString() { return "" + znak; } abstract double proved(double x, double y); }Program
public class VyzkousejOperator { public static void main(String[] args) { int x = 2, y = 10; for (Operator o : Operator.values()) { System.out.println(x + " " + o.toString() + " " + y + " = " + o.proved(x, y)); } for (Operator o : Operator.values()) { System.out.println(o.name() + " je konstantou třídy " + o.getDeclaringClass().getName() + ", ale instancí třídy " + o.getClass().getName()); } } }pak vypíše:
2 + 10 = 12.0 2 - 10 = -8.0 2 × 10 = 20.0 2 : 10 = 0.2 2 ^ 10 = 1024.0 2 √ 10 = 3.1622776601683795 SOUČET je konstantou třídy Operator, ale instancí třídy Operator$1 ROZDÍL je konstantou třídy Operator, ale instancí třídy Operator$2 SOUČIN je konstantou třídy Operator, ale instancí třídy Operator$3 PODÍL je konstantou třídy Operator, ale instancí třídy Operator$4 MOCNĚNÍ je konstantou třídy Operator, ale instancí třídy Operator$5 ODMOCNĚNÍ je konstantou třídy Operator, ale instancí třídy Operator$6
import java.util.EnumMap; enum Obdobi { JARO, LÉTO, PODZIM, ZIMA; } public class EnumMapPokus { public static void main(String[] args) { EnumMapem = new EnumMap (Obdobi.class); em.put(Obdobi.JARO, "Otepluje se"); em.put(Obdobi.PODZIM, "Ochlazuje se"); } }
import java.util.EnumSet; public class Mnozina { public static void main(String[] args) { EnumSet vsechny = EnumSet.allOf(DnyVTydnu.class); EnumSet nektere = EnumSet.of(DnyVTydnu.PA, DnyVTydnu.SO, DnyVTydnu.NE); EnumSet rozsah = EnumSet.range(DnyVTydnu.PO, DnyVTydnu.PA); System.out.println(vsechny); System.out.println(nektere); System.out.println(rozsah); } }
List <String> seznam = new ArrayList<String>();
for (String s : seznam) {
...
}
public static void printList(List<?> list) { for (Object elem: list) { System.out.print(elem + " "); } } List<Integer> li = Arrays.asList(1, 2, 3); List<String> ls = Arrays.asList("one", "two", "three"); printList(li); printList(ls);
public static double suma(List<Number> cisla) { double result = 0; for (Number e : cisla) { result += e.doubleValue() } return result; }Chceme-li však použit seznam List<Integer> jako parametr metody suma, nelze jej použít!!!
public static double suma(List<? extends Number> cisla) {
...
}
class Trida { private Object prvekX; private Object prvekY; public Trida(Object valX, Object valY) { prvekX = valX; prvekY = valY; } public void setElements(Object valX, Object valY) { prvekX = valX; prvekY = valY; } public Object getElementX() {return prvekX;} public Object getElementY() {return prvekY;} public static void main(String[] args) { Trida t = new Trida("A", "B"); ... Integer i = (Integer)t.getElementX(); // Předchozí příkaz půjde zkompilovat, // ale za běhu způsobí výjimku ClassCastException. } }
class GenerickaTrida<T> { private T prvekX; private T prvekY; public GenerickaTrida(T valX, T valY) { prvekX = valX; prvekY = valY; } public void setElements(T valX, T valY) { prvekX = valX; prvekY = valY; } public T getElementX() {return prvekX;} public T getElementY() {return prvekY;} public static void main(String[] args) { GenerickaTrida<String> t = new GenerickaTrida<String>("A", "B"); Integer i = (Integer)t.getElementX(); // Předchozí příkaz nepůjde zkompilovat // kvůli chybě "incorvetible types". } }
static void fromArrayToCollection(Object[] a, Collection<?> c) { for (Object o : a) { c.add(o); // chyba při překladu: incompatible types } } static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); // kompilátor OK } }
public static <U> void zjistiTridu(U u){ System.out.println("U: " + u.getClass().getName()); } public static void main(String[] args) { zjistiTridu(5); // vypíše "U: java.lang.Integer" zjistiTridu(5L); // vypíše "U: java.lang.Long" zjistiTridu(5.0); // vypíše "U: java.lang.Double" zjistiTridu(5F); // vypíše "U: java.lang.Float" zjistiTridu(5 + ""); // vypíše "U: java.lang.String" }
static <T extends Comparable> T max(T t1, T t2) { if (t1.compareTo(t2) > 0) { return t1; } else { return t2; } } public static void main(String[] args) { System.out.println(max("A", "B")); System.out.println(max(9, 4)); }
public <T, S extends T> void copy(List<T> dest, List<S> source) { ... }