Мне может понадобиться помощь с проблемой, с которой я сталкиваюсь с генериками Java. Я построил небольшой пример, чтобы показать, что я имею в виду.Ошибка доступа к генерическим файлам Java
Handler
package generalizingTest;
public class Handler<S extends Server<?>> {
public S server;
public Handler(S server) {
this.server = server;
}
}
SubHandler
package generalizingTest;
public class SubHandler<S extends Server<?>> extends Handler<S> {
public SubHandler(S server) {
super(server);
}
public void subHandlerMethod() {
}
}
Server
package generalizingTest;
import java.util.ArrayList;
public class Server<H extends Handler<?>> {
public ArrayList<H> handlers;
public Server() {
handlers = new ArrayList<H>();
}
public void addHandler(H c) {
handlers.add(c);
}
}
SubServer
package generalizingTest;
public class SubServer<H extends Handler<?>> extends Server<H> {
public void subServerMethod() {
}
}
Startup
package generalizingTest;
public class Startup {
public static void main(String[] args) {
Server<Handler<?>> serverWHandler = new Server<Handler<?>>();
Server<SubHandler<?>> serverWSubHandler = new Server<SubHandler<?>>();
SubServer<Handler<?>> subServerWHandler = new SubServer<Handler<?>>();
SubServer<SubHandler<?>> subServerWSubHandler = new SubServer<SubHandler<?>>();
Handler<Server<?>> handlerWServer = new Handler<Server<?>>(serverWHandler);
Handler<SubServer<?>> handlerWSubServer = new Handler<SubServer<?>>(subServerWHandler);
SubHandler<Server<?>> subHandlerWServer = new SubHandler<Server<?>>(serverWSubHandler);
SubHandler<SubServer<?>> subHandlerWSubServer = new SubHandler<SubServer<?>>(subServerWSubHandler);
serverWHandler.addHandler(handlerWServer);
subServerWHandler.addHandler(handlerWSubServer);
serverWSubHandler.addHandler(subHandlerWServer);
subServerWSubHandler.addHandler(subHandlerWSubServer);
subServerWHandler.subServerMethod();
subServerWSubHandler.subServerMethod();
handlerWSubServer.server.subServerMethod();
subHandlerWSubServer.server.subServerMethod();
subHandlerWServer.subHandlerMethod();
subHandlerWSubServer.subHandlerMethod();
System.out.println(subHandlerWSubServer.server.handlers.get(0).getClass().getName()); // SubHandler
//produces an error:
/*
* Unresolved compilation problem:
* The method subHandlerMethod() is undefined for the type Handler<capture#9-of ?>
*/
//subHandlerWSubServer.server.handlers.get(0).subHandlerMethod();
}
}
Я только начал изучать дженериков. Они кажутся эффективными, но я не уверен, правильно ли я решил проблему цикла generics() с подстановочным знаком и почему эти ошибки возникают.
Я действительно надеюсь, что кто-то может мне помочь.
EDIT:
Так что, похоже, что я не особо исходной задачи достаточно. Ниже должно быть возможно в любой глубине:
subHandlerWSubServer.server.handlers.get(0).server.handlers.get(0).server.handlers.get(0). ... .server.handlers.get(0).subHandlerMethod();
EDIT:
Так эта проблема, кажется, не разрешимы из-за бесконечный цикл определения или отсутствующего self
значения, см Siguza’s anwser. Вот discussion между Siguza, user889742 и myself об этой теме.
@MK. Вы удалили там комментарии? – Feirell
Непонятно, чего вы пытаетесь достичь, но я не думаю, что это имеет смысл. Вам действительно нужно иметь два класса, специализирующихся друг на друге? Я не могу представить, почему вам это понадобится. Неудивительно, что попытка выразить это неестественное кровосмесительное отношение будет соответствовать сопротивлению от системы типа языка. –
@ MK. представленный пример нуждается в таких отношениях, когда обеим сторонам нужно знать все методы/переменные-члены противоположности, которые достижимы с помощью генериков. – Feirell