首页 > 解决方案 > 简单的 java 类型推断失败

问题描述

我有一个通用接口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();
        }

有人可以解释一下吗?

标签: javagenericstypesinference

解决方案


你似乎认为那List<LunarOccultationState>是一种List<ExternalState<T>>。它不是。请参阅这篇文章了解原因。

您可以做的是接受 aList<? 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();
}

推荐阅读