有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

两个泛型参数具有相同上限时的java Unchecked cast警告

我有一个对其他泛型类进行操作的泛型类:

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

以及在约束(DistributionContextBaseDistributionResultBase)中共享相同基类型的TContextProvider和TStrategy类型:

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类评论中标记的“unchecked cast”警告。对我来说,似乎总是保证所有类型都将从约束中使用的基类派生:

TContextDistributionService=TContextDistributionContextProviderBase

TResultDistributionService=TResultDistributionStrategyBase

我知道用@SuppressWarnings(“unchecked”)来消除这个警告是不可能的,但我很好奇是否还有其他正确的方法


共 (0) 个答案