gpt4 book ai didi

通用类型的 Java 枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:10 25 4
gpt4 key购买 nike

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

感谢任何帮助。

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

public class XEnumTypeHandler extends CommonEnumTypeHandler<X> {
}

当前代码:

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;
}
}

我在上面的代码中添加了错误标记,错误信息是这样的:

  • 无法解决
  • 方法 value() 未定义T型
  • 方法 values() 未定义T型
  • 方法 values() 未定义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);
}
}

我继承了这个类:

public class SalesChannelTypeHandler extends CommonEnumTypeHandler<SalesChannel> {

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

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

}

最佳答案

我不确定你在做什么(最好用文字概括一下),但是:

  • 你做不到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"
}

所以我们使用 Enum.valueOf 采用类型标记 Class<T extends Enum<T>> , 并询问 enum具有给定名称的常量。 valueOf NOT 不区分大小写,但按照惯例,所有 常量都应为大写,因此我们只需获取查询字符串并将其转为 .toUpperCase() .

关于通用类型的 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3044796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com