この問題を回避することはできますが、理解できないので、いくつかの説明を求めています(そしておそらくより良い質問のタイトルも)。
これを考慮してください:
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();
それを機能させます。しかし、ここで何が起こっているのでしょうか?私は何が欠けていますか?