【问题标题】:Simple java type inference fails简单的 java 类型推断失败
【发布时间】:2026-01-20 04:45:02
【问题描述】:

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

有人能解释一下吗?

【问题讨论】:

    标签: java generics types inference


    【解决方案1】:

    你似乎认为List&lt;LunarOccultationState&gt;List&lt;ExternalState&lt;T&gt;&gt; 的一种。它不是。请参阅this post 了解原因。

    您可以做的是接受List&lt;? extends ExternalState&lt;T&gt;&gt;。这种类型的列表不允许你往里面添加东西,这也是List&lt;LunarOccultationState&gt;不是List&lt;ExternalState&lt;T&gt;&gt;的一种主要原因。但是您没有在列表中添加任何内容,所以没关系。

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

    【讨论】: