gpt4 book ai didi

Java泛型访问错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:17 24 4
gpt4 key购买 nike

我可能需要一些帮助来解决我在 Java 泛型方面遇到的问题。我构建了一个小例子来说明我的意思。

处理程序

package generalizingTest;

public class Handler<S extends Server<?>> {
public S server;

public Handler(S server) {
this.server = server;
}
}

子处理器

package generalizingTest;

public class SubHandler<S extends Server<?>> extends Handler<S> {

public SubHandler(S server) {
super(server);
}

public void subHandlerMethod() {

}

}

服务器

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);
}
}

子服务器

package generalizingTest;

public class SubServer<H extends Handler<?>> extends Server<H> {
public void subServerMethod() {

}
}

class diagram

启动

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();

}
}

我刚开始学习泛型。它们似乎很有效,但我不确定我是否使用通配符正确解决了泛型循环 () 的问题以及为什么会出现这些错误。

我真的希望有人能帮助我。

编辑:

看来我没有足够强调最初的问题。以下内容在任何深度都应该是可能的:

subHandlerWSubServer.server.handlers.get(0).server.handlers.get(0).server.handlers.get(0). ... .server.handlers.get(0).subHandlerMethod();

编辑:

所以这个问题似乎由于定义的无限循环或缺少self值而无法解决,参见Siguza’s anwser .这是 discussionSiguza 之间, user889742myself关于这个话题。

最佳答案

如果我没理解错的话,如果你有一个 Handler<S>您希望该服务器上的所有处理程序都是 Handler<S> 类型,对吧?
为此,S.add()将不得不只接受 Handler<S> 类型的对象.但是为了在基类中实现它 Server , 你需要 S ,所以:

public class Server<H>
{
public ArrayList<H<S>> handlers;

public Server()
{
handlers = new ArrayList<H<S>>();
}

public void addHandler(H<S> c)
{
handlers.add(c);
}
}

唯一的问题是 S未定义,您不能轻易定义它。在 Server 的上下文中,您需要的是, 表示 Server ,并在 SubServer 的上下文中, 表示 SubServer .基本上 this.getClass() , 但作为编译时类型表达式。如果 Java 有一个关键字,比如 self ,你可以这样使用它:

public class Server<H>
{
public ArrayList<H<self>> handlers;

public Server()
{
handlers = new ArrayList<H<self>>();
}

public void addHandler(H<self> c)
{
handlers.add(c);
}
}

然后Server.add()需要 Handler<Server> , 和 SubServer.add()需要 Handler<SubServer> .

可悲的是,Java has no such thing ,因此您无法通过这种方式尝试执行的操作。

Java 擅长很多事情。
泛型不是其中之一。

关于Java泛型访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com