반응형
이 예제를 고려하십시오 (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
반응형
'자바' 카테고리의 다른 글
객체 힙에 충분한 공간을 예약 할 수 없었습니다 (0) | 2021.04.12 |
---|---|
ArrayList에 값이 있는지 확인하십시오 (0) | 2021.04.12 |
문자열에서 모든 char의 모든 발생을 제거하십시오 (0) | 2021.04.12 |
java의 전역 변수 (0) | 2021.04.12 |
정규식을 사용하여 하위 문자열을 추출하는 방법 (0) | 2021.04.12 |
댓글