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 ...]

コンパイラエラーが発生します(Eclipseのオートコンプリートも機能しません):

The method getProjects() is undefined for the type Object

doGetメソッドにカーソルを合わせると、Eclipseは次のように定義されていることを示します。

 <Object> Object TBGService.doGet(TBGObject model)

他の場所では、ホバーすると署名が次のように正しく表示されます。

 <TBGProjects> TBGProjects TBGService.doGet(TBGObject model)

パラメータを指定して呼び出された場合new TBGProjects()

変更するだけ:

List<TBGProject> list = TBGService.get(repository)
    .doGet(new TBGProjects()).getProjects();

と:

TBGProjects projects = TBGService.get(repository).doGet(new TBGProjects());
List<TBGProject> = projects.getProjects();

それを機能させます。しかし、ここで何が起こっているのでしょうか?私は何が欠けていますか?

4

1 に答える 1

3

JavaはT、メソッドの戻り値を何に割り当てるかに基づいて、のタイプを推測します。

戻り値を何にも割り当てない場合、Javaは何Tをすべきかわかりません。

これを修正するには、パラメータをタイプに変更して、 Javaが渡したパラメータからT推測できるようにします。T

public <T extends TBGObject> T doGet(T model) throws TBGServiceException {
于 2013-01-21T00:00:09.240 に答える