Genericμ μ¬μ©νλ€λ³΄λ©΄ ν λ²μ―€μ λ§μ£ΌμΉκ² λλ κ°λ
μΈ κ³΅λ³μ±μ κ°λ¨ν μ 리νλ€.
Genericμ κΈ°λ³Έμ μΌλ‘ 무곡λ³μ΄λ€.
π Animal μ μμ ν΄λμ€,
π Cat μ νμ ν΄λμ€μ΄λ€.
π Haru λ νμ ν΄λμ€μ΄λ€.
class Animal {}
class Cat extends Animal {}
class Haru extends Cat {}μμ κ°μ κ³μΈ΅ ꡬ쑰λ₯Ό μ€μ νκ³ κ³΅λ³μ±μ λν΄ μ΄ν΄λ³Έλ€.
- π Invariance
"μμ - νμ κ΄κ³μ¬λ λ€λ₯Έ νμ
μΌλ‘ κ°μ£Όλλ€."
List<Cat>μ List<Animal>μ νμ νμ
μ΄ μλλ€.
List<Cat> cats = new ArrayList<>();
List<Animal> animals = cats; // βμ»΄νμΌ μλ¬ λ°μGenericμ κΈ°λ³Έμ μΌλ‘ 무곡λ³μ΄κΈ° λλ¬Έμ νμ
μ΄ μ νν μΌμΉνμ§ μμΌλ©΄ λμ
ν μ μλ€.
μ΄μ λ Animal μ μ¬λ¬ νμ νμ
μ΄ μ‘΄μ¬ν λ νμ
μμ μ±μ΄ κΉ¨μ§κΈ° λλ¬Έμ΄λ€.
List<Animal> animals = cats; κ° νμ©λλ©΄, class Dog extends Animal {} λ ν΄λΉ λ³μμ μΆκ°λ μ μμ.
λ§μ½ new ArrayList<>(cats); λ‘ νκ²λλ©΄, λ³΅μ¬ μμ±μ λ°©μμΌλ‘ μ
μΊμ€ν
μ ν΅ν΄ 리μ€νΈλ₯Ό μμ±νλ―λ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
- π Covariance
"νμ νμ
μ μμ νμ
μΌλ‘ λ€λ£° μ μλλ‘ νμ©"
List<Cat>μ List<? extends Animal>μ νμ νμ
μΌλ‘ νμ©λλ€.
List<Cat> cats = new ArrayList<>();
List<? extends Animal> animals = cats; // β
μ»΄νμΌ μλ¬ μμ
animals.add(new Cat()); // β μ°κΈ°λ§ νμ©νμ§λ§, μ°κΈ°λ νμ©λμ§ μλλ€. μ€μ§ μ½κΈ°λ§ κ°λ₯νλ€.
μ»΄νμΌλ¬λ List<? extends Animal> animals κ° μ νν μ΄λ€ νμ
μΈμ§ μ μ μλ€.
Animalμ νμ νμ
μ λͺ¨λ νμ©λλ―λ‘ μ½κΈ°λ§ κ°λ₯νκ³ μ°κΈ°λ₯Ό μ ννλ κ²μ΄λ€.
μ΄λν νμ
μμ μ±μ λν μ΄μ μΈλ°, μ°κΈ°κ° νμ©λλ€λ©΄,
List<? extends Animal> animals = cats; νμ¬ List<Cat> μ λ€λ¦μ΄ μλλ°
animals.add(new Dog())μμ νμ
μμ μ±μ΄ λ¬Έμ λλ€.
μ»΄νμΌλ¬κ° μ»΄νμΌ μμ μ μ μ μλ νμ
κ³Ό λ°νμ κ³Όμ μμ μ μ μλ κ²μ νμ
μμ μ±μ κΉ° μ μμΌλ―λ‘ μ μ΄μ νμ©νμ§ μλλ€.
List<? extends T> λ μ»΄νμΌ μμ μ μ νν μ΄λ€ νμ
μΈμ§ μ μ μλ€. νμ¬ μ°κΈ°λ₯Ό μ ννλ€. (μ½κΈ°λ 무쑰건 Animal νμ
.)
List<Cat> cats = new ArrayList<>();
List<? extends Animal> animals = cats;
Cat cat = cats.get(0); // κ°λ₯. (ArrayIndexOutOfBoundsException 무μ)
animals.add(new Animal()); // λΆκ°: Animalμ΄ Catμ νμ νμ
μ΄ μλ.
animals.add(new Cat()); // λΆκ°: 곡λ³μ±μμλ μΆκ° λΆκ°.- π Contravariance
"νμ νμ
μ μμ νμ
μ μμ νκ² μΆκ°ν μ μλλ‘ νμ©"
List<Animal>μ List<? super Cat>μ μμ νμ
μΌλ‘ νμ©λλ€.
Catμ μμ νμ
λ€μ μ§ν© 리μ€νΈμ΄λ―λ‘ λ€μν νμ
λ€μ΄ μ‘΄μ¬ν μ μμ΄ μ½κΈ°λ μ΅μμ νμ
μΈ Objectλ‘ μ½κ³ , μ°κΈ°λ κ°λ₯νλ€.
List<? super Cat> list = List.of(new Cat(), new Haru());
Object animal1 = animals.get(0); // λ°κ³΅λ³μ±μ κΈ°λ³Έμ μΌλ‘ Object λ‘ λ¦¬ν΄.
Cat animal2 = (Cat) animals.get(0);
// Cat animal2 = (Cat) animals.get(0); // λͺ
μμ νλ³νμ΄ μμΌλ©΄ μλ¬
Animal animal3 = (Animal) animals.get(0);
// Animal animal3 = animals.get(0); // λͺ
μμ νλ³νμ΄ μμΌλ©΄ μλ¬μ°Έκ³ λ‘ μ€λ²λ‘λ©ν λ μ λ€λ¦μ νμ μκ±°μ κ΄κ³ μλ€.
void something(List<Number> args){...}
void something(List<String> args){...}