gpt4 book ai didi

java - 使用泛型可以解决我的问题吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:02:11 27 4
gpt4 key购买 nike

我正在使用 java.util.concurrency 框架实现一些代码。我将把一组可调用对象传递给一个类,该类将并行执行它们。我正在尝试找出以类型安全的方式获取每个响应的最佳方法。这里有一些代码可以帮助解释我在做什么:

首先,我创建了我的 Callable,它们是要并行调用的工作单元。例如,这里的第一个工作单元返回一个 String,第二个工作单元返回一个 Integer:

Callable<String> firstCallable = new Callable<String>(){
public String call() {...}
};

Callable<Integer> secondCallable = new Callable<Integer>(){
public Integer call() {...}
};

现在我将它们注入(inject)我的框架以并行运行它们,诀窍是获取适当响应对象的句柄。这是一个有效的实现:

Map<Callable,Object> responseMap = ParallelSender.send(firstCallable, 
secondCallable);

其中 Object 是特定 Callable 的响应。因此,您可以这样做:

String firstCallableResponse = (String)responseMap.get(firstCallable);
Integer secondCallableResponse = (Integer)responseMap.get(secondCallable);

所以我的问题是,是否可以在从 Map 获取数据时避免强制转换?这不会编译,但我正在按照以下思路思考:

Map<Callable<T>, T> responseMap = ParallelSender.send(...);
String firstCallableResponse = responseMap.get(firstCallable);

使得返回的值基于 Callable 键的类型化参数。我担心的是,如果有人重构工作单元的返回类型(比如从 IntegerBigDecimal 或其他),那么从 Object 进行转换永远不会被自动重构工具捕获,并可能导致运行时问题。


结论:由于下面所有有用的评论和讨论,我采取了稍微不同的策略(尽管 Sean Patrick Floyd 对我上面的问题做出了正确的评价)。我最终放弃了响应映射并用响应填充 Callable 对象。以下是相关的代码片段:

public abstract class AbstractParallelCallable<V> implements Callable<V> {

/** The response generated by the Call method of this class. */
private V callableResponse;

public V getResponse() {
return callableResponse;
}

public void setResponse(V response) {
callableResponse = response;
}
}

因此,我有一个抽象实现,它通过存储响应来包装 Callable 对象。接下来,在我的并行处理中,我得到每个 Future 创建的响应并填充 AbstractParallelCallable:

for (ParallelFutureTask<Object> future : futures) {
try {
future.getCallableHandle().setResponse(future.get());
} catch(Exception e) {...}
}

其中 getCallableHandle 通过提供对 Callable 对象的引用返回 AbstractParallelCallable 对象和 ParallelFutureTask 包装器 FutureTask。执行后,调用代码可以执行以下操作:

Integer theResult = firstCallable.getResponse();

最佳答案

基于方法的方法

唯一的方法就是将它封装在一个方法中:

class ParallelSender{

private final Map<Callable<?>, Object> map =
new HashMap<Callable<?>, Object>();

@SuppressWarnings("unchecked")
public <T> T getResult(final Callable<T> callable){
return (T) map.get(callable);
}

}

客户端代码

现在您的客户端代码不需要转换:

ParallelSender parallelSender = new ParallelSender();
Callable<Integer> integerCallable = new Callable<Integer>(){

@Override
public Integer call() throws Exception{
return Integer.valueOf(1);
}
};
Integer result = parallelSender.getResult(integerCallable);

关于java - 使用泛型可以解决我的问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4723384/

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