我有一个方法,在使用本机查询时为枚举值列表的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>)
我不知道我想要以通用方式定义我传递给此方法的列表,因为这会留下错误的余地,但我无法弄清楚如何解决此错误。
我已经四处寻找并尝试了一些不同的东西,但没有人直接解决这个问题,所以我不确定从哪里开始。
答案 0 :(得分:2)
即使EventType
是Enum
,List<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 ){