gpt4 book ai didi

java generics - 确保工厂方法返回的对象与同一类型相关

转载 作者:行者123 更新时间:2023-11-30 07:27:58 24 4
gpt4 key购买 nike

我有以下代码:

interface Factory<T extends A<S>, S extends B> {
T getA();
S getB();
}

...

interface A<T extends B> {
void doB(T b);
}

...

interface B { }

现在我正在尝试做的是一个方法 getFactory,它返回我任意的 Factory-ies。工厂类型参数确保(据我所知)我可以调用

Factory<?????> factory = getFactory();
factory.getA().doB(factory.getB());

但是我无法获得正确的类型参数。有可能吗?

我试过了

Factory<? extends A<? extends B>, ? extends B> factory = getFactory();

但是呢?延伸 B 和 ? extends B 是两个不同的东西,尽管 Factory 类保证它们是相同的!

最佳答案

首先,让我稍微澄清一下您的示例代码。让它像这样:

interface Factory<SpecificHandler extends Handler<SpecificMessage>, SpecificMessage extends Message> {
SpecificHandler getHandler();
SpecificMessage getMessage();
}


interface Handler<T extends Message> {
void handle(T b);
}


interface Message { }

因此,您有一个工厂,可以生成消息和该特定消息的处理程序。以下代码不起作用,因为编译器懒得检查,处理程序和消息都来自同一个工厂:

Factory<? extends Handler<?>, ? extends Message> factory = getFactory();
Handler<? extends Message> handler = factory.getHandler();
Message message = factory.getMessage();
handler.handle(message);//error

要解决这个问题,您必须将类型参数绑定(bind)到相同的实际类型。但你不知道确切的类型。我能想到的唯一可能的解决方案:

<T extends Message> void doWork() {
Factory<? extends Handler<T>, T> x = getFactory();
Handler<T> handler = x.getHandler();
T message = x.getMessage();
handler.handle(message);
}

void test() {
doWork();
}

这里我们在方法签名中引入了一个无意义的类型参数 T,只是为了将处理程序和工厂绑定(bind)到相同的消息类型。

关于java generics - 确保工厂方法返回的对象与同一类型相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9375888/

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