java - 简单的 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
从开始List
, 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>>
。它不是。请参阅这篇文章了解原因。
您可以做的是接受 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();
}
推荐阅读
- kubernetes - 如何动态分配 targetPort?
- perl - 根据 Perl Catalyst 应用程序上的配置变量加载模块
- c - 如何在c中实现继承类?
- python - 使用 tensorflow API tf.data.Dataset.list_files 时出现 Unicode 错误
- google-apps-script - 谷歌表格脚本或公式添加页码
- php - 保存到数据库时Laravel间接修改重载属性错误
- php - 如何解决“SameSite”属性
- php - 无法将 HTML 请求数据发布到控制器
- javascript - 在javascript中进行搜索数组搜索
- c++ - 如何在内存编辑器中提升访问内存的权限?