코린이의 소소한 공부노트

지네릭스와 다형성 본문

Java

지네릭스와 다형성

무지맘 2022. 11. 9. 01:42

class Product {}		// 부모
class Tv extends Product {}	// 자식1
class Audio extends Product {}	// 자식2

3가지 부모-자식 클래스들을 이용해서 지네릭스에 다형성이 어떤 식으로 적용되는지 살펴보려 한다.

 

1. 참조변수와 생성자에 대입된 타입은 무조건 일치해야 한다.

ArrayList<Product> productList = new ArrayList<Product>();// OK
ArrayList<Tv>      tvList = new ArrayList<Tv>(); // OK
ArrayList<Product> tvList = new ArrayList<Tv>(); // 에러. 부모 자손 관계여도 지네릭 타입이 다르면 에러

2. 지네릭 클래스 간의 다형성은 성립한다. 대입된 타입은 같아야 한다.

List<Tv> tvList = new ArrayList<Tv>(); // OK. ArrayList가 List를 구현
List<Tv> tvList = new LinkedList<Tv>(); // OK. LinkedList가 List를 구현

3. 매개변수의 다형성도 성립한다.

productList.add(new Tv()); // OK. public boolean add(Product o)
productList.add(new Audio()); // OK. public boolean add(Product o)

tvList.add(new Tv()); // OK. public boolean add(Tv o)

Tv t1 = tvList.get(0); // OK
Tv t2 = (Tv)productList.get(0); // public Product get(int index)
				// 조상 객체가 자손에 선언될 때는 형변환이 필요

4. 메서드의 매개변수로 지네릭스가 쓰인 경우 지네릭 타입이 똑같아야 호출이 가능하다.

public static void printAll(ArrayList<Product> list) {
    for(Product p : list)
        System.out.println(p);
}

// main()
printAll(productList); // OK.
printAll(tvList); // 컴파일 에러. 지네릭 타입이 일치하지 않기 때문에 printAll() 호출 불가

 

'Java' 카테고리의 다른 글

와일드카드 ?와 지네릭 메서드  (0) 2022.11.14
지네릭 클래스의 예시와 제한  (0) 2022.11.14
지네릭스  (0) 2022.11.09
Collections 클래스  (0) 2022.11.08
HashMap, Hashtable 클래스  (0) 2022.11.08