传递带有泛型的枚举列表

时间:2014-08-27 16:24:12

标签: java generics enums

我有一个方法,在使用本机查询时为枚举值列表的in子句构建SQL。问题是我无法弄清楚如何使它与特定的枚举列表一起工作,只有通用列表。

以下是方法:

public static String toDbInClauseEnum( final List<Enum<?>> pEnums )
{
    if ( pEnums == null || pEnums.isEmpty() )
    {
        throw new IllegalArgumentException( "Null or empty list passed to method." );
    }

    StringBuilder inClause = new StringBuilder();
    inClause.append( "(" );
    boolean addComma = false;
    for ( Enum<?> e : pEnums )
    {
        if ( addComma )
        {
            inClause.append( ",'" + e.name() + "'" );
        }
        else
        {
            inClause.append( "'" + e.name() + "'" );
            addComma = true;
        }
    }
    inClause.append( ")" );
    return inClause.toString();            
}

如果我尝试传递一个常规的枚举值列表,例如

List<EventType>

我收到错误:

The method toDbInClauseEnum(List<Enum<?>>) in the type DatabaseUtil is
not applicable for the arguments (List<EventType>)

我不知道我想要以通用方式定义我传递给此方法的列表,因为这会留下错误的余地,但我无法弄清楚如何解决此错误。

我已经四处寻找并尝试了一些不同的东西,但没有人直接解决这个问题,所以我不确定从哪里开始。

2 个答案:

答案 0 :(得分:2)

即使EventTypeEnumList<EventType>也不是List<Enum<?>>,因为Java的泛型是不变的。

更改toDbInClauseEnum的签名以包含上限通配符:

//                                                vvvvvvvvv
public static String toDbInClauseEnum( final List<? extends Enum<?>> pEnums )

这将起作用,因为通配符允许子类类型,例如EventType,是通用类型参数。

答案 1 :(得分:1)

public static String toDbInClauseEnum( final List<? extends Enum<?>> pEnums ){

或者

public static <E extends Enum<E>> String toDbInClauseEnum( final List<E> pEnums ){