프로그래밍 언어/JAVA

Java 제네릭이 암시 적으로 다형성이 아닌 이유

Rateye 2021. 9. 8. 10:19
728x90
반응형
질문 : 목록 List의 하위 클래스 ? Java 제네릭이 암시 적으로 다형성이 아닌 이유는 무엇입니까?

Java 제네릭이 상속 / 다형성을 처리하는 방법에 대해 약간 혼란 스럽습니다.

다음 계층을 가정합니다.

동물 (부모)

- 고양이 (어린이)

doSomething(List<Animal> animals) 메서드가 있다고 가정합니다. 상속 및 다형성의 모든 규칙에 따라 List<Dog> List<Animal> 이고 List<Cat> List<Animal> 하므로 둘 중 하나를이 메서드에 전달할 수 있습니다. 별로. doSomething(List<? extends Animal> animals) 이라고 말하여 Animal의 하위 클래스 목록을 허용하도록 메서드에 명시 적으로 지시해야합니다.

이것이 Java의 행동이라는 것을 이해합니다. 내 질문은 ? 왜 다형성은 일반적으로 암시 적이지만 제네릭에 관해서는 지정해야합니까?

답변

아니요, List<Dog>List<Animal> 이 아닙니다 . List<Animal> 할 수있는 작업을 고려하세요. 고양이를 포함하여 모든 동물을 추가 할 수 있습니다. 이제 논리적으로 강아지 한 떼에 고양이를 추가 할 수 있습니까? 절대적으로하지.

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

갑자기 매우 혼란스러운 고양이가 생겼습니다.

이제 List<? extends Animal> Cat 를 추가 할 수 없습니다. List<Cat> 인지 모르기 때문에 List<? extends Animal> 합니다. 값을 검색하고 그것이 Animal 임을 알 수 있지만 임의의 동물을 추가 할 수는 없습니다. 그 반대는 List<? super Animal> -이 경우 Animal List<Object> 일 수 있기 때문에 무엇을 검색 할 수 있는지 알 수 없습니다.

출처 : https://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-are-java-generics-not-implicitly-po
728x90
반응형