package hu.itk.ppke.lesson5.generics.example2;

import java.util.Arrays;
import java.util.List;

/**
 * Példa típusparaméter nélküli osztályban lévő generikus metódusra,
 * illetve a wildcard operátorra.
 * 
 * @author kozcs
 * 
 */
public class Printer {

	/**
	 * Az osztálynak nincs generikus típusparamétere. Viszont a metódusainak még
	 * lehet! Ez a metódus kiírja a konzolra a bementi objektumot leíró
	 * információkat.
	 * 
	 * @param t
	 *            a kiírandó objektum
	 */
	public <T> void print(T t) {
		System.out.println(t.toString()); 	// a toString() hívást megtehetjük,
											// mivel az Object-nek,
											// így minden Java osztálynak van
	}

	/**
	 * Ez a metódus olyan listát fogad, melynek bármilyen típusparamétere lehet.
	 * Kiírja az összes elemét a konzolra.
	 * 
	 * @param l
	 *            a lista a kiírandó elemekkel
	 */
	public void printList(List<?> l) {
		for (Object e : l)
			System.out.println(e);
	}

	/**
	 * Korlátot is adhatunk a típushalmaznak (jelen esetben felső korlátot). Ez
	 * a fv. kiírja a listában szereplő szám double értékét.
	 * 
	 * @param l
	 *            a lista a kiírandó elemekkel
	 */
	public void printDoubleValues(List<? extends Number> l) {
		for (Number e : l)
			System.out.println(e.doubleValue()); 	// a Number definiálja a
													// doubleValue metódust,
													// tehát a leszármazottjai
													// is öröklik
	}

	public static void main(String[] args) {
		Printer p = new Printer();

		p.print(2);
		p.print("Hello world!");
		
		List<Integer> l = Arrays.asList(1, 2, 3);
		
		p.printList(l);
		p.printDoubleValues(l);
	}
}
