package l29_1;

public class LinkedList <E> {
	
	private E payload;
	private LinkedList<E> next;
	
	public LinkedList(E payload) { this.payload=payload; }
	
	public void insertTail(E obj) {
		if (next!=null) next.insertTail(obj); else next=new LinkedList<E>(obj);
	}
	
	public void addList(LinkedList<? extends E> app) {
		if (app!=null) {
			insertTail(app.payload);
			addList(app.next);
		}
	}
	public String toString() {
		if (next==null) return payload.toString();
		return payload.toString() + "->" + next.toString();
	}
	
	@SafeVarargs
	public static <T extends Number> double sum(T ...vals) {
		double sum=0.0;
		for(T val : vals) { sum+=val.doubleValue(); }
		return sum;
	}

	public static void main(String[] args) {
		LinkedList<String> list = new LinkedList<String>(args[0]);
		for(int i=1;i<args.length;i++) list.insertTail(args[i]);
		System.out.println("list: " + list);
		
		LinkedList<Bird> blist = new LinkedList<Bird>(new Duck("Quack"));
		blist.insertTail(new Bird("Tweet"));
		System.out.println("blist: " + blist);
		LinkedList<Duck> dlist = new LinkedList<Duck>(new Duck("Quawck"));
		// dlist.insertTail(new Bird("BobWhite"));
		System.out.println("dlist: " + dlist);
		// LinkedList<Bird> blist2 = dlist; 
		
		blist.addList(dlist);
		System.out.println("blist after add: " + blist);
		// dlist.addList(blist);
		
		
		System.out.println("Sum: " + sum(14.3,32,-5));

	}
}

class Bird {
	private String name;

	public Bird(String name) { this.name = name; }
	public String getName() { return name; }
	public String toString() { return "Bird: " + name; }
}

class Duck extends Bird {
	public Duck(String name) { super(name); }
	public String toString() { return "Duck: " + super.getName(); }
}