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


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같은거 안쓰고 위에처럼 제네릭한 타입을 반환할수는 없나요?

  • 2016년 01월 20일에 작성됨

조회수 218


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

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

  • 2016년 01월 20일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close