我对Java泛型接口和类型通配符感到困惑。 我试图实现一种通用的方法来将选项列表传递给一个方法,其中选项的类型在编译类型是未知的。
我按以下方式做了,但是在编译时遇到错误。
通用接口:
public interface IOption<T> {
public T getOption();
}
此方法应该输入未知类型的选项列表,因此我使用了通配符。
public interface IAction {
boolean do(Iterable<IOption<?>> options);
}
我创建了以下布尔选项列表:
IOption<Boolean> option = new IOption<Boolean>(){
@Override
public Boolean getOption() {
return new Boolean(doEnable);
}
};
Iterable<IProjectStateOption<Boolean>> options =
Collections.singletonList(option);
但是当调用方法do
时,我收到以下错误:
The method do( Iterable<IOption<?>>) in the type IAction is not applicable for
the arguments (Iterable<IOption<Boolean>>)
答案 0 :(得分:1)
Iterable<Option<Boolean>>
无法转换为Iterable<Option<?>>
,即使Option<Boolean>
可转换为Option<?>
。
您想要Iterable<? extends Option<?>>
。
答案 1 :(得分:1)
由于Iterable<IProjectStateOption>
对Iterable<IOption>
无效,因此您必须更改do方法或特定迭代器。
public interface IAction {
boolean do(Iterable<? extends IOption> options);
}
如果您要指定IOption
的具体类型,则需要在<T>
中使用IAction
public interface IAction<T>