我有一个方法createFoo(),它创建Foo< T>的实例.使用Class< T> T的实例现在我想扩展该方法以将使用枚举类型进行的调用转发给方法createEnumFoo().从第一个方法调用第二个方法似乎是非平凡的.下面是我如何设法使用两个未经检查的强制转换和一个额外的方法,我想摆脱所有这些的例子.
方法castEnumType()是必需的,因为我找不到一种方法来转换类到类< E extends Enum< E>>没有E绑定某处.这涉及一个未经检查的强制转换,因为我还没有找到使用Class.asSubclass()的方法.在创建Foo的实例之后,我需要从Foo< E>中投射它.到Foo< T>虽然E和T总是相同的类型.
我无法削弱createEnumFoo()的签名,因为它调用Enum.valueOf(enumType,…)并要求其结果为E类型.
final class Example {
> Foo createEnumFoo(Class enumType) {
// This makes use of e.g. Enum.valueOf(enumType, ...).
return null;
}
> Class castEnumType(Class> enumType) {
return (Class) enumType;
}
Foo createFoo(Class type) {
if (Enum.class.isAssignableFrom(type))
return (Foo) createEnumFoo(castEnumType(type));
else
// Here we would do something else or maybe throw an exception.
return null;
}
interface Foo {
}
}
有更简单的方法吗?
一些背景
为了澄清我面临的问题,我将解释这个问题是如何在我正在进行的项目中出现的:
在我遇到这个问题的代码中,Foo< T>实际上是Converter< T>,它是一个允许T实例从JSON值序列化和反序列化的接口:
public interface Converter {
JsonObject encode(T value);
T decode(JsonObject data);
}
而createFoo()实际上是一个方法converterForType(),它取一个Class< T>实例并动态调度到一堆静态方法和字段,这些方法和字段创建/包含特定于项目的常见Java类型和类型的转换器.通常,当需要转换器时,直接访问适当的方法/字段,但有些地方只在运行时知道类型,这是使用converterForType()的地方.
现在我想扩展该方法,通过将枚举类型转换为包含枚举常量名称的JSON字符串来自动处理枚举类型.这就是我需要从converterForType()调用方法enumConverter()的原因.这是enumConverter()的实现:
public static > Converter enumConverter(final Class enumClass) {
return new Converter() {
public JsonObject encode(E value) {
return Json.convert(value.name());
}
public E decode(JsonObject data) {
return Enum.valueOf(enumClass, data.asString());
}
};
}