ArrayList<Tv> list = new ArrayList<Tv>(); // OK. 일치
ArrayList<Product> list = new ArrayList<Tv>(); // 에러. 일치
지네릭 클래스간의 다형성은 성립(여전히 대입된 타입은 일치해야)
List<Tv> list = new ArrayList<Tv>(); // OK. 다형성. ArrayList가 list를 구현
List<Tv> list = new LinkedList<Tv>(); // OK. 다형성. LinkedList가 list를 구현
List : 조상, ArrayList : 자손
매개변수의 다형성도 성립
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); // OK. - Tv : Product 자손
list.add(new Audio()); // OK. - Audio : Product 자손
다형성 - Product와 그 자손 객체 가능get메서드 - Product 타입이 대입됨
Product p = list.get(0); // Product객체는 형변환이 필요없다.
Tv t = (Tv)list.get(1); // Product의 자손객체들은 형변환을 필요로 한다.
list.get(o)의 반환타입이 Product이기 때문에, Product객체는 형변환이 필요 없다. 그러나 Tv객체는 형변환을 필요로 한다. Product의 자손객체들도 형변환을 필요로 하기 때문이다.
import java.util.*;
class Product {}
class Tv extends Product {}
class Audio extends Product {}
class Ex12_1 {
public static void main(String[] args) {
ArrayList<Product> productList = new ArrayList<Product>();
ArrayList<Tv> tvList = new ArrayList<Tv>();
// ArrayList<Product> tvList = new ArrayList<Tv>(); // 컴파일 에러. '대입된 타입'의 불일치
// List<Tv> tvList = new ArrayList<Tv>(); // OK. 지네릭 클래스간의 다형성은 성립
productList.add(new Tv()); // public boolean add(Product e) { ← Product 또는 그 자손 객체 OK.
productList.add(new Audio());
tvList.add(new Tv()); // public boolean add(Tv e) { ← Tv 또는 그 자손 객체 OK.
tvList.add(new Tv());
// tvList.add(new Audio()); // 컴파일 에러. Audio와 Tv는 서로 아무런 관계도 아니기 때문
printAll(productList); // Ok. ← productList 대입된 타입 = ArrayList<Product>
// printAll(tvList); // 컴파일 에러. new ArrayList<Tv>를 대입 불가 ← tvList 타입 = ArrayList<Tv>
}
public static void printAll(ArrayList<Product> list) { // new ArrayList<Tv>(); 대입 불가.
for (Product p : list) // 참조변수에 '대입된 타입'인 <Product>와 생성자에 '대입된 타입'이 불일치하기 때문
System.out.println(p);
}