본문 바로가기
자바

메소드 리턴 유형을 어떻게 만드는 방법은 무엇입니까?

by º기록 2021. 4. 12.
반응형

이 예제를 고려하십시오 (OOP 책에서 전형적인) :

각 <코드> 동물 가 많은 친구를 가질 수있는 동물 클래스가 있습니다.
bark () 와 같은 특정 동작을 추가하는 dup , mouse , 마우스 등의 서브 클래스를 k @>()

여기에 <코드> 동물 클래스가 있습니다.

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 를 사용하여 추가 매개 변수없이 런타임에 런타임에 반환 유형을 파악할 수있는 방법이 있습니까?또는 적어도 더미 인스턴스 대신 유형의 클래스를 전달하여

나는 제네릭이 컴파일 타임 유형 검사를위한 것이지만이를위한 해결 방법이 있습니까?

 

해결 방법

 

이 방법으로 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();

이 코드는 컴파일러 경고를 생성하지 않는 이점이 있습니다.물론 이것은 사전 일반 일의 주조의 업데이트 된 버전 일뿐 만 아니라 추가 안전을 추가하지 않습니다.

 

참조 페이지 https://stackoverflow.com/questions/450807

 

 

반응형

댓글