通用类型的Java枚举

Mar*_*lke 8 java generics enums

我想为IBatis创建一个基于枚举的通用映射器.我正在使用以下代码执行此操作.这确实有编译时错误,我不知道如何修复.也许我的解决方案是完全错误的(请记住使用IBatis),在这种情况下请提出更好的建议.

任何帮助赞赏.

我想要实现的是将后续的映射器定义为:

public class XEnumTypeHandler extends CommonEnumTypeHandler<X> {
}
Run Code Online (Sandbox Code Playgroud)

目前的代码:

public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {

 public void setParameter(ParameterSetter ps, Object o) throws SQLException {
  if (o.getClass().isAssignableFrom(**T**)) { 
   ps.setString(((**T**) o).value().toUpperCase());
  } else
   throw new SQLException("Excpected ParameterType object than: " + o);
 }

 public Object getResult(ResultGetter rs) throws SQLException {
  Object o = valueOf(rs.getString());
  if (o == null)
   throw new SQLException("Unknown parameter type: " + rs.getString());
  return o;
 }

 public Object valueOf(String s) {
  for (T pt : T.**values()**) {
   if (pt.**value()**.equalsIgnoreCase(s))
    return pt;
  }
  return null;
 }
}
Run Code Online (Sandbox Code Playgroud)

我在上面的代码中添加了错误标记,错误消息按顺序排列:

  • T无法解决
  • 对于类型T,方法value()未定义
  • 对于类型T,方法值()未定义
  • 对于类型T,方法值()未定义

我用以下代码解决了这个问题:

public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {

    Class<T> clazz;

    public CommonEnumTypeHandler(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void setParameter(ParameterSetter ps, Object o) throws SQLException {
        if (o.getClass().isAssignableFrom(clazz)) {
            ps.setString(((T) o).name().toUpperCase());
        } else
            throw new SQLException("Excpected " + clazz + " object than: " + o);
    }

    public Object getResult(ResultGetter rs) throws SQLException {
        Object o = valueOf(rs.getString());
        if (o == null)
            throw new SQLException("Unknown parameter type: " + rs.getString());
        return o;
    }

    public Object valueOf(String s) {
        return Enum.valueOf(clazz, s);
    }
}
Run Code Online (Sandbox Code Playgroud)

继承这个类我做:

public class SalesChannelTypeHandler extends CommonEnumTypeHandler<SalesChannel> {

    public SalesChannelTypeHandler() {
        super(SalesChannel.class);
    }

    public SalesChannelTypeHandler(Class<SalesChannel> clazz) {
        super(clazz);
    }

}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 8

我不确定你在做什么(用文字总体概述会很好),但是:

  • 你做不到isAssignableFrom(T)(你需要一个Class对象),你也做不到instanceof T(泛型是非定义的).您可能希望传递Class<T>类型标记.
  • 你看过了EnumMap吗?

也可以看看


目前还不清楚需要什么,但也许这就是这样:

enum Color { BLACK, WHITE; }

public static void main(String[] args) {
    Color c = Enum.valueOf(Color.class, "black".toUpperCase());
    System.out.println(c); // prints "BLACK"
}
Run Code Online (Sandbox Code Playgroud)

所以我们使用Enum.valueOf它接受一个类型标记Class<T extends Enum<T>>,并询问它是否enum具有给定名称的常量.valueOf区分大小写的,而是由惯例,所有的常量应该是大写的,所以我们干脆把查询字符串,并把它.toUpperCase().