带有WildCard的java中的通用接口

时间:2014-03-23 17:42:58

标签: java generics types type-conversion

我对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>>)

2 个答案:

答案 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>