Я смотрю на некоторый код GXT для GWT, и я наткнулся на это использование Generics, которое я не могу найти другой пример в учебниках Java. Имя класса com.extjs.gxt.ui.client.data.BaseModelData
, если вы хотите посмотреть на весь код. Вот важные части:
private RpcMap map;
public <X> X get(String property) {
if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) {
return (X)NestedModelUtil.getNestedValue(this, property);
}
return map == null ? null : (X) map.get(property);
}
X
не определено нигде в классе или где-либо в иерархии, и когда я нажимаю «перейти к объявлению» в затмении, он просто переходит на <X>
в сигнатуре открытого метода.
Я пытался вызвать этот метод на следующих двух примерах, чтобы увидеть, что происходит:
public Date getExpiredate() {
return get("expiredate");
}
public String getSubject() {
return get("subject");
}
Они компилируются и не показывают ошибок или предупреждений. Я бы подумал, что, по крайней мере, мне придется сыграть команду, чтобы заставить это работать.
Значит ли это, что Generics допускает магическое возвращаемое значение, которое может быть чем угодно и просто взорвется во время выполнения? Это противоречит тому, что должны делать дженерики. Может кто-нибудь объяснить мне это и, возможно, дать мне ссылку на документацию, которая объясняет это немного лучше? Я просмотрел 23-страничный PDF-файл Sun, посвященный шаблонам, и каждый пример возвращаемого значения определяется либо на уровне класса, либо в одном из переданных параметров.