>Java >java지도 시간 >이기종 컬렉션에서 개체를 검색할 때 제네릭이 어떻게 Typecasting을 제거할 수 있습니까?

이기종 컬렉션에서 개체를 검색할 때 제네릭이 어떻게 Typecasting을 제거할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-24 00:19:10281검색

How Can Generics Eliminate Typecasting When Retrieving Objects from Heterogeneous Collections?

반환 유형의 제네릭을 사용하여 유형 변환 극복

OOP 프로그래밍에서 클래스는 종종 관련 개체의 컬렉션을 유지 관리합니다. 예를 들어, Animal 클래스는 Dog 및 Duck과 같은 다양한 하위 클래스의 인스턴스가 될 수 있는 친구 목록을 추적할 수 있습니다.

전통적으로 이 목록에서 특정 친구를 검색하려면 유형 변환이 필요합니다. 컬렉션. 그 결과 다음과 같은 코드가 생성됩니다.

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();

이 솔루션은 런타임 유형 변환을 제거하고 반환된 객체가 원하는 하위 클래스로 안전하게 변환될 수 있도록 보장합니다.

위 내용은 이기종 컬렉션에서 개체를 검색할 때 제네릭이 어떻게 Typecasting을 제거할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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