>Java >java지도 시간 >제네릭은 동물 친구 검색에서 유형 캐스팅을 어떻게 제거할 수 있습니까?

제네릭은 동물 친구 검색에서 유형 캐스팅을 어떻게 제거할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-11 14:21:17449검색

How Can Generics Eliminate Type Casting in Animal Friend Retrieval?

일반 메소드 반환 유형에서 유형 캐스팅을 제거하는 방법

고전적인 OOP 시나리오를 고려해 보세요. Dog, Duck과 같은 다양한 하위 클래스가 있는 Animal 클래스입니다. , 및 마우스는 각각 고유한 동작을 가지고 있습니다. 각 동물은 친구 모음을 가질 수 있으며 서로 상호 작용할 수 있습니다.

public class Animal {
    private Map<String, Animal> friends = new HashMap<>();

    public void addFriend(String name, Animal animal) {
        friends.put(name, animal);
    }

    public Animal callFriend(String name) {
        return friends.get(name);
    }
}

그러나 친구의 특정 행동을 검색하려면 다음 코드 조각에서 볼 수 있듯이 타입 캐스팅이 필요합니다.

Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());

((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();

이 유형변환을 제거하기 위해 제네릭을 사용하여 callFriend 메소드의 반환 유형을 만들 수 있습니다. 유연합니다.

public <T extends Animal> T callFriend(String name, T unusedTypeObj) {
    return (T) friends.get(name);
}

이 접근 방식은 반환 유형을 사용되지 않은 매개변수로 메서드에 전달하지만, 더 우아한 해결책은 런타임에 반환 유형을 결정하는 것입니다.

이를 달성하는 한 가지 방법 callFriend 메소드를 수정하는 것입니다:

public <T extends Animal> T callFriend(String name, Class<T> type) {
    return type.cast(friends.get(name));
}

이렇게 하면 메소드를 다음과 같이 호출할 수 있습니다. 다음은 다음과 같습니다.

jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();

이 방법은 컴파일러 경고가 없다는 이점을 제공하지만 본질적으로 사전 제네릭 캐스팅의 업데이트된 버전이며 안전성을 향상시키지 않습니다.

위 내용은 제네릭은 동물 친구 검색에서 유형 캐스팅을 어떻게 제거할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.