2013-01-20 5 views
0

나는이 문제를 해결할 수 있지만 그것을 이해할 수 없다. 그래서 나는 약간의 설명 (그리고 아마도 더 좋은 질문 제목을 요구하고있다)을 요구하고있다.자바 익명 클래스 열거 형 컴파일 오류

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

는 작동합니다. 하지만 여기서 무슨 일이 일어나고있는거야? 내가 뭘 놓치고 있니?

+0

BTW, 그와 같은 클래스 인스턴스를 전달하는 것은 매우 비효율적이다. 'Class '매개 변수를 받아 들여서 대신 'TBGProjects.class'를 전달해야합니다. – SLaks

+0

나는 본다; 실제로 전달 된 클래스에는 추상 수퍼 클래스에 필요한 논리가 포함되어 있습니다. 진입 점은 생성자를 호출하기위한 입력을 알고, 서비스 (json 클라이언트)는 추상 동작을 제외하고는 아무것도 모릅니다. 이 디자인에 더 나은 패턴을 찾으려고합니다. –

+0

'getObjectKey()'대신 클래스에서 주석을 사용하고자 할 수 있습니다. – SLaks

답변

3

Java는 메소드의 리턴 값을 지정하는 것에 기초하여 T 유형을 유추합니다.

반환 값을 지정하지 않으면 Java는 T이 무엇인지 잘 모릅니다.

는이 문제를 해결하려면, 당신은 너무 자바 당신이 전달하는 매개 변수에서 T을 추론 할 수 타입 T의 수 매개 변수를 변경할 수 있습니다

public <T extends TBGObject> T doGet(T model) throws TBGServiceException { 
+0

오, 그래, 그게 쉽지, 고마워! 다른 사람의 코드를 읽고 이해하려고 애 씁니다. –

+0

부탁드립니다. 다른 클래스에서 똑같은 변경되지 않은 전화가 왜 작동 했습니까? –

+0

@guido : 나는 그것이 왜 효과가 있을지 모른다. 컴파일하는 완전한 예제를 보여줄 수 있습니까? – SLaks