나는이 문제를 해결할 수 있지만 그것을 이해할 수 없다. 그래서 나는 약간의 설명 (그리고 아마도 더 좋은 질문 제목을 요구하고있다)을 요구하고있다.자바 익명 클래스 열거 형 컴파일 오류
public class TBGService {
// TBGObject is an abstract base class which is extended by model classes
public <T> T doGet(TBGObject model) throws TBGServiceException {
String uri = model.buildUrl(repository) + model.getObjectKey();
GetMethod method = new GetMethod(uri);
T returned = execute(method, credentials, model.getClass());
return returned;
}
}
을이 :
이 고려하시기 바랍니다 내가 열거 항목을 정의하려면이 코드를 작성할 때
public enum TBGTaskAttributes {
private TBGTaskAttributes(String id, String type, String label, Object... flags) {
builder = new TaskAttributeBuilder();
builder.withId(id).withLabel(label);
for (Object flag : flags) {
processFlag(flag);
}
}
public abstract String getValueFromIssue(TBGIssue issue);
public abstract void setValueInIssue(TBGIssue issue, String value);
}
:
PROJECT(TaskAttribute.PRODUCT, TaskAttribute.TYPE_SINGLE_SELECT, "Project", new OptionProvider() {
@Override
public Set<Entry<String, String>> getOptions(TaskRepository repository) {
try {
List<TBGProject> list = TBGService.get(repository)
.doGet(new TBGProjects()).getProjects();
[...]
return map.entrySet();
} catch (TBGServiceException e) { [...] }
return null;
}
}) {
@Override
public String getValueFromIssue(TBGIssue issue) {
return issue.getProjectKey();
}
@Override
public void setValueInIssue(TBGIssue issue, String value) {
issue.setProjectKey(value);
}
},
[... other items ...]
내가받을 컴파일러 오류를 (또한 일식 자동 완성 기능이 작동하지 않음) :
(210)The method getProjects() is undefined for the type Object
와 나는의 doGet 메소드를 올려 놓으면 다음과 같이 정의로 그것을 보여 일식 :
<TBGProjects> TBGProjects TBGService.doGet(TBGObject model)
매개 변수 new TBGProjects()
호출 : 다른 곳에서
<Object> Object TBGService.doGet(TBGObject model)
는 유혹이 제대로으로 서명을 보여줍니다.
그냥 변경 :
List<TBGProject> list = TBGService.get(repository)
.doGet(new TBGProjects()).getProjects();
로 :
TBGProjects projects = TBGService.get(repository).doGet(new TBGProjects());
List<TBGProject> = projects.getProjects();
는 작동합니다. 하지만 여기서 무슨 일이 일어나고있는거야? 내가 뭘 놓치고 있니?
BTW, 그와 같은 클래스 인스턴스를 전달하는 것은 매우 비효율적이다. 'Class'매개 변수를 받아 들여서 대신 'TBGProjects.class'를 전달해야합니다. –
SLaks
나는 본다; 실제로 전달 된 클래스에는 추상 수퍼 클래스에 필요한 논리가 포함되어 있습니다. 진입 점은 생성자를 호출하기위한 입력을 알고, 서비스 (json 클라이언트)는 추상 동작을 제외하고는 아무것도 모릅니다. 이 디자인에 더 나은 패턴을 찾으려고합니다. –
'getObjectKey()'대신 클래스에서 주석을 사용하고자 할 수 있습니다. – SLaks