Это то, на чем я столкнулся, пытаясь решить чужой вопрос здесь, в упрощенной версии. Клиент и сервер с рефлексивной (циклической) зависимостью используют общие методы, чтобы попытаться сохранить строго типизированные ссылки в суперклассе. Желание было для произвольных подтипов подтипа, таких как ClientType1 < -> ServerType2, а для строго типизированных вызовов по специализированным методам, найденным только в определенном типе.Классы дженериков с рефлексивной зависимостью
Это работает только на одном уровне глубины: от сервера к клиенту, но не удается, если вы затем попытаетесь продолжить с этого клиента обратно на сервер: Есть ли какой-либо синтаксис, который бы разрешал произвольные уровни строго типизированных вызовов?
abstract class ServerBase<C extends ClientBase<?>>
{
ArrayList<C> clients = new ArrayList<C>();
}
abstract class ClientBase<S extends ServerBase<?>>
{
S server;
}
class ClientType1<S extends ServerBase<?>> extends ClientBase<S>
{
public void clientType1Method() {}
}
class ServerType1<C extends ClientBase<?>> extends ServerBase<C>
{
}
public class Example {
public static void main(String[] args) {
ServerType1<ClientType1<?>> s = new ServerType1<>();
s.clients.get(0).clientType1Method(); // Single depth level - OK
s.clients.get(0).server.clients.get(0).clientType1Method(); // level 2 - compiler error - undefined method
}
}
Спасибо, хотя это и не было смысла. Он должен работать на произвольных уровнях, и clientMethod должен быть уникальным в каждом производном классе (например, другое имя или подпись) –