질문 : 목록 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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java에서 현재 stack trace를 얻는 방법 (0) | 2021.09.13 |
---|---|
[오류]JsonMappingException : No suitable constructor found for type [simple type, class ]: can not instantiate from JSON object (0) | 2021.09.13 |
자바 스크립트 배열을 선언 할 때 "Array ()"와 "[]"의 차이점 (0) | 2021.09.07 |
Java에서 SoftReference와 WeakReference의 차이점 (0) | 2021.09.03 |
Java String을 byte []로 변환하는 방법 (0) | 2021.09.02 |