메소드에서 generic한 타입으로 반환하려면 어떻게해야하나요.

조회수 7293회

OOP책에서 밑에 같은 예제를 보자면

Animal 클래스가 있으면 각 animal은 여러 친구를 가지고 있습니다. 그리고 하위 클래스로는 Dog,Duck,Mouse 등이 있습니다. 얘네는 각자 bark(), quack() 같은 울음 소리를 냅니다.

소스코드

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

위의 코드는 이런식으로 캐스팅연산을 써서 사용가능한데 제가 원하는 건

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

이렇게 캐스팅연산없이 제네릭한 타입으로 타입에 맞게 리턴형을 바꿔줄수 없냐는거에요.

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

이런 식으로 말이에요. instanceof같은거 안쓰고 위에처럼 제네릭한 타입을 반환할수는 없나요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

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

    이렇게 호출할수있습니다. 이코드는 컴파일러 경고가 발생하지않습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)