제네릭을 사용하기 위해 기존 클래스를 변환하려고하는데 생성자를 변환하는 동안 난처 해집니다.
원래 클래스는 텍스트 기반 콘솔 게임에서 한 방에서 다른 방으로 이동하는 논리를 포함하는 POJO였습니다. 말 그대로 액션을 실행하는 문자열 트리거 (예 : 사용자가 "walk right"입력), 설명 및 새 위치에 대한 포인터를 포함하는 클래스였습니다.
현재 클래스의 제네릭이 아닌 버전은 다음과 같습니다.
public class Navigation implements Serializable {
private static final long serialVersionUID = 1L;
private String trigger;
private String description;
private Location target;
public Navigation() {
this("", "", new Location());
}
public Navigation(String trigger, String description, Location target) {
this.trigger = trigger;
this.description = description;
this.target = target;
}
// plus getters, setters, etc.
}
( Location
클래스는 위치를 설명하는 또 다른 POJO입니다. 관련이 없습니다.)
s Navigation
가 아닌 대상을 처리 할 수 있도록 클래스 를 확장하고 싶습니다 Location
. 이 작업을 수행하는 가장 좋은 방법은 Navigation
제네릭을 사용 하도록 클래스를 변환하는 것이라고 생각 했기 때문에 다음과 같이 시도했습니다.
public class Navigation<T> implements Serializable {
private static final long serialVersionUID = 2L;
private String trigger;
private String description;
private T target;
public Navigation() {
this("", "", new T());
}
public Navigation(String trigger, String description, T target) {
this.trigger = trigger;
this.description = description;
this.target = target;
}
// plus getters, setters, etc.
}
그러나 인스턴스화 할 수 this("", "", new T());
없기 때문에 줄에서 컴파일되지 않습니다 T
. 이 컨텍스트에서 제네릭 형식 개체를 인스턴스화 할 수 있습니까?
기본적으로 두 가지 선택이 있습니다.
1. 인스턴스 필요 :
public Navigation(T t) {
this("", "", t);
}
2. 클래스 인스턴스가 필요합니다.
public Navigation(Class<T> c) {
this("", "", c.newInstance());
}
팩토리 패턴을 사용할 수 있지만 궁극적으로 이와 동일한 문제에 직면하게되지만 코드의 다른 곳으로 푸시하면됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다