Witam, chcialem poprosic o wyjasnienie dzialania castowania - sama idee rozumiem, ale w praktyce nie wiem co sie dzieje w ponizszym przykladzie:
class Automobile {}
public class Holder {
private Object a;
public Holder(Object a) { this.a = a; }
public void set(Object a) { this.a = a; }
public Object get() { return a; }
public static void main(String[] args) {
Holder h = new Holder(new Automobile());
Automobile a = (Automobile)h.get();
h.set("not an automobile");
}
}
Poczatek jest jasny, konstruktor, metody w stylu setter i getter. Pozniej nie bardzo wiem - linia Holder h = new Holder(new Automobile()); wywoluje konstruktor klasy Holder z argumentem typu Automobile, ale konstruktor przyjmuje argumenty typu Object, wiec co sie z tym dzieje? Dalej tez nie bardzo rozumiem - obiekt h ma metode get, wiec zwraca zawartosc pola private Object a chyba, ale czemu jest uzyte castowanie? Potem z kolei jako parametr jest podany string. Czy obiekt typu Object przyjmuje typ dowolny i sie w niego zmienia? Jesli tak, to czemu trzeba castowac?
Drugie pytanie dotyczy Arrays.asList. Mam ponizszy kod:
List<Shape> shapeList = Arrays.asList(new Circle());
List<Shape> shapeList = Arrays.asList(new Circle(), new Triangle());
W pierwszym przypadku, gdy podaje 1 argument, dostaje blad - Type mismatch: cannot convert from List<Circle> to List<Shape>. Gdy dodam drugi obiekt do listy - problem znika. Zarowno Circle jak i Triangle sa podtypami Shape. Czemu tak sie dzieje?