简单java类型推断失败

67up9zun  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(420)

我有一个通用接口 ExternalState<T> 以及一个实现它的类:

public class MockState<T extends Comparable<T>> implements ExternalState<T> {
}

然后,我有一个类扩展了这个实现:

public class LunarOccultationState extends MockState<Boolean> {
    ...
}

我有以下通用方法:

public  <T extends Comparable<T>> StateConstraintExpression.Builder equal(List<ExternalState<T>> states, T value) {
                for(var state : states){
                    StateConstraintEqual<T> sce = StateConstraintExpression.buildEqualConstraint(state, value);
                    this.constraints.add(new StateConstraintExpression(sce));
                }
            }
            return getThis();
  }

但当我尝试调用此方法时:

equal( lunarOccultationStates, false )

lunarOccultationStates 作为 ListLunarOccultationState ,类型推断失败。我很难理解的是,以下方法(没有列表)中的类型推断是有效的:

public  <T extends Comparable<T>> StateConstraintExpression.Builder equal(ExternalState<T> state, T value) {
                    StateConstraintEqual<T> sce = StateConstraintExpression.buildEqualConstraint(state, value);
                    this.constraints.add(new StateConstraintExpression(sce));
            return getThis();
        }

有人能解释一下吗?

vojdkbi0

vojdkbi01#

你好像觉得 List<LunarOccultationState> 是一种 List<ExternalState<T>> . 事实并非如此。请看这篇文章了解原因。
你能做的就是接受 List<? extends ExternalState<T>> 相反。这种类型的列表不允许您向其中添加内容,这是 List<LunarOccultationState> 不是一种 List<ExternalState<T>> . 但是你没有在列表中添加任何内容,所以没关系。

public  <T extends Comparable<T>> StateConstraintExpression.Builder equal(List<? extends ExternalState<T>> states, T value) {
    for(var state : states){
        StateConstraintEqual<T> sce = StateConstraintExpression.buildEqualConstraint(state, value);
        this.constraints.add(new StateConstraintExpression(sce));
    }
    return getThis();
}

相关问题