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)
我在上面的代码中添加了错误标记,错误消息按顺序排列:
我用以下代码解决了这个问题:
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)
我不确定你在做什么(用文字总体概述会很好),但是:
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().
| 归档时间: |
|
| 查看次数: |
17104 次 |
| 最近记录: |