Можно ли ссылаться на вложенный общий параметр в java?

Я не уверен, что такое технический термин для этого, но рассмотрим интерфейс:

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 (При публикации щедрости): В этот момент то, что я ищу по этому вопросу, является причиной того, что язык требует этого дублирования. Это то, что до сих пор отсутствовало в ответах, чтобы принять один из них.

Ответы

Ответ 1

public interface SomeRelatedInterface<T> {  
    T doSomethingRelated(SomeInterface<T> relative);
}

Ответ 2

"В этот момент то, что я ищу по этому вопросу, является причиной того, что язык требует этого дублирования"

Ну, язык требует, чтобы вы определили 2 типа параметров в вашем примере, потому что в описываемой вами проблеме есть, um, 2 типа типа: вы хотите, чтобы метод был переменным как в типе T, так и в реализация SomeInterface.

Это ортогональные соображения, поэтому для их представления требуется более одного параметра типа.

Параметры типа, конечно, не обязательно должны определяться на классе/интерфейсе; они могут быть определены по методу. Ответ J-16 SDiZ позволяет вашему родному классу/интерфейсу иметь только один параметр типа. Второй параметр типа объявляется только там, где это необходимо, по методу doSomethingRelated

Ответ 3

Хорошо, я начал щедрость по этому вопросу и не знал, что так поведение должно было дать кому-то ответ (поздравляю Даниэлю), я думал, что репутация не будет вознаграждена, и я потеряю ее. О, хорошо.

Во всяком случае, я наконец получил свой ответ. Из здесь:

К сожалению, для обратной совместимости новая Map() указывает на необработанный тип и поэтому не может использоваться для вывода типа.

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

Ответ 4

Посмотрите, подходит ли это вам:

public interface SomeRelatedInterface<T> {
     public  <D extends SomeInterface<T>> T doSomethingRelated(D relative);
}

Ответ 5

Поскольку параметры типа стираются во время компиляции, IMHO вы, к сожалению, не можете достичь того, чего хотите, не указав T как параметр второго типа, как и в первом примере.