반환 유형의 제네릭을 사용하여 유형 변환 극복
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!