Java Generics: как я могу назначить возвращаемое значение метода, который использует множественное наследование - PullRequest
3 голосов
/ 08 ноября 2011

У меня есть метод, который возвращает сложный универсальный тип (который реализует несколько интерфейсов)

protected abstract <BOB extends Stan & Jan<I>> BOB getStanAndJanItem();

Это прекрасно компилируется, и я могу переопределить его и вернуть значения.Как только я это называю, я получаю ошибки компиляции (даже не нужно ничего назначать).И я думаю, это имеет смысл, поскольку BOB определяется только внутри метода.

Итак, как мне определить bob на уровне класса?

И ДА, я знаю, что могу просто разделитьвызовы и они возвращают один и тот же объект или вводят какое-то дополнительное наследование (и я, вероятно, в конечном итоге сделаю это), но можно ли это сделать также и так?*
Несовпадение границ: универсальный метод getStanAndJanItem () типа MyAbstractClass<I> не применим для аргументов ().Предполагаемый тип Stan не является допустимой заменой ограниченного параметра <BOB extends Stan & Jan<I>>

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

Настоящей проблемой является отсутствие поддержки типа пересечения .Предположим, что язык поддерживает это напрямую, мы можем написать тип пересечения, например A&B и т. Д., И ваш пример будет выглядеть как

Stan&Jan<I> getStanAndJanItem()

void setStanAndJanItem(Stan&Jan<I> item)


Stan&Jan<I> result = getStanAndJanItem();
result.doStanStuff();
result.doJanStuff();

setStanAndJanItem(result);

Без такой поддержки мы застряли.Ваше обобщенное объявление, вероятно, неверно: оно подразумевает, что вызывающая сторона решает тип BOB, в то время как вы, вероятно, хотите, чтобы реализация определяла тип BOB.Реализация может вернуть все, что реализует как Stan, так и Jan<I>.В настоящее время это требование не может быть выражено.

0 голосов
/ 08 ноября 2011

Для вызова метода необходимо передать параметр универсального типа, соответствующий вашему ограничению.
Даже если вашему конкретному вызову это не нужно, вам все равно нужно передать параметр type.

Следовательно, метод можно вызывать только в том случае, если вы параметризуете его с помощью некоторого класса или интерфейса, который реализует оба этих типа.

...