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