简单 java 类型推断失败

Simple java type inference fails

我有一个通用接口 ExternalState<T> 和一个实现它的 class :

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

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

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 )

with lunarOccultationStates as List of LunarOccultationState,类型推断失败。 对我来说难以理解的是以下方法(没有列表)中的类型推断有效:

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

有人可以解释一下吗?

你好像认为List<LunarOccultationState>List<ExternalState<T>>的一种。它不是。参见 this post 了解原因。

您可以改为接受 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();
}