gpt4 book ai didi

java - 当两个泛型参数具有相同的上限时,未经检查的强制转换警告

转载 作者:行者123 更新时间:2023-11-30 10:33:56 24 4
gpt4 key购买 nike

我有一个在其他泛型类上运行的泛型类:

public abstract class DistributionService<TInput extends DistributionInputBase,
TContextProvider extends DistributionContextProviderBase,
TContext extends DistributionContextBase,
TStrategy extends DistributionStrategyBase,
TResult extends DistributionResultBase> {
private final TContextProvider _distributionContextProvider;

public DistributionService(TContextProvider distributionContextProvider){
_distributionContextProvider = distributionContextProvider;
}

//@SuppressWarnings("unchecked")
public TResult GetResult(TInput input, TStrategy[] distributionStrategies){
//unchecked cast warning
TContext context = (TContext)_distributionContextProvider.getContext(input);
TResult result = null;

for (TStrategy strategy: distributionStrategies){
//unchecked cast warning
result = (TResult)strategy.Distribute(context);
if (result != null)
break;
}

return result;
}
}

以及在约束中共享相同基本类型的 TContextProvider 和 TStrategy 类型( DistributionContextBaseDistributionResultBase ):
public abstract class DistributionContextProviderBase<TContext extends DistributionContextBase, TInput extends DistributionInputBase> {
public abstract TContext getContext(TInput input);
public abstract int getOpenIssueCount(Workforce workforce);
}

public abstract class DistributionStrategyBase<TContext extends DistributionContextBase, TResult extends DistributionResultBase> {
protected WorkforceDistributionContext _context;

protected String GetReason(TResult result){
String reason = GetReasonSub(result);

if (_context.HasRules()){
reason += "\nRule(s) applied: " + _context.GetRules();
}

return reason;
}

public abstract TResult Distribute(TContext context);
protected abstract TResult DistributeSub(TContext context);
protected abstract String GetReasonSub(TResult result);
}

但是我收到了 DistributionService 类中的注释中标记的“未经检查的类型转换”警告。对我来说,似乎总是保证所有类型都来自约束中使用的基类:
TContextDistributionService = TContextDistributionContextProviderBase TResultDistributionService = TResultDistributionStrategyBase
我知道用@SuppressWarnings("unchecked") 摆脱这个警告是可能的,但我很好奇是否有任何其他方法可以正确地做到这一点。

最佳答案

类型参数的范围仅限于 class或已定义的方法。 TContext尽管它似乎在两个类中都使用了,但它并没有超越类。既然已经解决了这个问题,让我们来解决实际问题。

For me it seems that it is always guaranteed that all types will be derived from base classes used in constraints:



但是等式两边的类型总是可以相互分配吗?注意语句 distributionContextProvider.getContext(input);可以返回 DistributionContextBase或任何它的子类。同时, TContextDistributionService可以替换为 DistributionContextBase或任何它的子类。

考虑 distributionContextProvider.getContext(input) 的情况。返回 DistributionContextBase但是 TContextDistributionService替换为 DistributionContextBase 的子类反而。以下转换将导致 ClassCastException并且编译器正在完成它的工作并警告您:
TContext context = (TContext)_distributionContextProvider.getContext(input);

关于java - 当两个泛型参数具有相同的上限时,未经检查的强制转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939058/

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