gpt4 book ai didi

java - 避免返回通配符类型的方法

转载 作者:行者123 更新时间:2023-11-30 07:59:14 26 4
gpt4 key购买 nike

这是我的应用程序设计,我试图避免从我的方法返回通配符类型,以便我可以调用返回对象上的方法。有什么建议么?毕竟,使用静态实用程序方法来查找并返回正确的处理程序实现(如下所示)是一个糟糕的主意吗?

问题:我有很多请求(以及与它们相对应的响应)。必须处理这些请求,并且处理结果(响应)可用于进一步处理。在给定时刻处理哪个请求取决于一些条件(这是一个枚举)。

我的方法:我的解决方案是构建多个处理程序,每个处理程序对应一种请求-响应类型组合,并让它们全部实现一个公共(public)接口(interface),并提供一种处理请求的方法。

事情是这样的:

实现Handler接口(interface)的一系列处理程序类:

interface Handler<Q extends Request, R extends Response> {
R handleRequest(Q);
}

和一个静态实用方法伴随类来查找匹配给定条件的正确处理程序:

class Handlers {
Handler<? extends Request, ? extends Response> handlerForCriteria(Criteria criteria) {
switch (criteria):
...
// since there are several handler implementations, I couldn't avoid the wildcard
// types for the request and response
}
}

这是我需要使用它的地方:

Handler<? extends Request, ? extends Response> matchingHandler = 
Handlers.handlerForCriteria(criteria);
MyResponse response = matchingHandler.handleRequest(myRequest);

我希望能够像上面那样调用 handleRequest ,但显然我不允许这样做,因为 matchingHandler 包含通配符类型(它不能确定请求的未知通配符类型是否与“myRequest”类型相同。

最佳答案

如有必要,请使用带有强制转换的类型化方法:

class Handlers {
<R extends Request, T extends Response> Handler<R, T> handlerForCriteria(Criteria criteria) {
Handler<?, ?> handler = someStrategryThatIsUntyped();
return (Handler<R, T>)handler; // just cast
}
}
<小时/>

那么,为什么/什么时候 Actor 阵容“安全”?

有时,这种情况既需要又安全。例如,考虑以下代码:

private Map<Class<?>, Handler<?>> handlers = new HashMap<>();

并且您以保证类的类型等于处理程序的类型的方式填充它(这不能在映射的声明中完成):

public <T> void register(Class<T> clazz, Handler<T> handler) {
handlers.put(clazz, handler);
}

但是找到处理程序的方法无法根据映射的定义安全地编译:

public <T> Handler<T> findHandler(Class<T> clazz) {
Handler<?> handler = handlers.get(clazz);
// Although the compiler can't assert it, the handler is of type T
// The cast is safe, because we programmatically constrain map's entries
return (Handler<T>)handler; // safe
}

关于java - 避免返回通配符类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194306/

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