class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Dog[] dogs = new Dog[3];
dogs[0] = new Dog();
dogs[1] = new Dog();
dogs[2] = new Dog();
Animal[] animals = dogs; // 배열의 공변성
animals[0].makeSound(); // Dog barks
animals[1].makeSound(); // Dog barks
animals[2].makeSound(); // Dog barks
}
}
Dog라는 클래스를 통하여 dogs 배열이 생성이 되었으며
Animal이라는 클래스를 통하여 dogs 배열이 하위 타입으로 형변환될 수 있는 성질을 가리킨다.
List[] stringLists = new List[2];
List intList = List.of(1, 2, 3);
Object[] objArray = stringLists;
objArray[0] = intList;
String str = stringLists[0].get(0);
stringLists -> List[2] : element 2개
intList -> List[3] -> Integer
ObjArray[0] -> List[3] -> 1st Element
StringLists[0] -> List[3].get(0)
배열은 공변성을 지원한다.
Heap pollution을 야기함
반면 Generic은 공변성 그딴거 없음. 타입 안정성을 위해 만들어졌으니까
-> 배열을 그러면 못쓰잖아? -> ㅋㅋ 콜렉션을 쓰면 되지!