Я склонен ставить C / C ++ в своих вопросах.
Как правило, я ищу что-то, что я могу использовать в своем приложении c ++.
Если код написан на C или C ++, я могу его использовать, поэтому я бы предпочел не просто ограничивать возможные ответы одним или другим.
public interface SomeRelatedInterface<T> {
T doSomethingRelated(SomeInterface<T> relative);
}
Поскольку параметры типа стираются во время компиляции, ИМХО вы, к сожалению, не можете достичь того, чего хотите, не указав T в качестве второго параметра типа, как вы это делали в первом примере.
Посмотрите, подходит ли это вам:
public interface SomeRelatedInterface<T> {
public <D extends SomeInterface<T>> T doSomethingRelated(D relative);
}
Ну, я назначил награду по этому вопросу и не знал, что поведение SO заключалось в том, чтобы дать кому-то ответ (поздравляю, Дэниел), я думал, что представитель останется без награды, и я потеряю его. Ладно.
В общем, наконец-то я получил ответ. Из здесь :
К сожалению, в целях обратной совместимости new Map () указывает на необработанный тип и поэтому не может использоваться для вывода типа.
Так что в основном при создании класса и передаче в параметре типа вывод типа был отключен, чтобы оставить место для необработанного типа.
«На этом этапе я ищу по этому вопросу причину, по которой язык требует этого дублирования»
Ну, язык требует, чтобы вы определяли 2 параметра типа в вашем примере, потому что в описываемой вами задаче есть, гм, 2 параметра типа: вы хотите, чтобы метод был переменным как в типе T
, так и в в реализации SomeInterface
.
Это ортогональные соображения и, следовательно, вам нужно более одного параметра типа для их представления.
Параметры типа, конечно, не нужно определять в классе / интерфейсе; их можно определить по методу. Ответ J-16 SDiZ позволяет соответствующему классу / интерфейсу иметь только один параметр типа. Затем параметр второго типа объявляется только там, где он необходим,