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