子类化泛型类型,从另一个类中的方法返回子类的实例

时间:2010-08-04 14:47:29

标签: java generics

这是一个如此简单,精彩的想法。使用Java 5.0枚举类型的强大功能来编码数据字典的详细信息(属性名称,类型,范围,单位等),并创建一个类型安全的系统来设置和读取属性值(i,.e。,属性AAH很短,ACC被枚举,只应接受值ACC001,ACC002,ACC003等)。

问题是不同的属性有不同的类型(整数,浮点数,文本,枚举),每种类型的行为都不同。所以我创建了一个带有类型参数和一些抽象方法的基类:

public abstract class GsAttributeValueBase<T extends Comparable<T>> {
  protected T m_value;
  ...
  public GsAttributeValueBase(...) {..}
  ...
  public abstract void SetValue(T value) throws IllegalArgumentException;
  public T GetValue() { return m_value; }
  // etc., etc., etc
}

然后我为每种类型子类化(基本上,我试图伪造部分特化):

public class GsAttributeValueShort extends GsAttributeValueBase<Short> {...}
public class GsAttributeValueLong  extends GsAttributeValueBase<Long> {...}
public class GsAttributeValueEncoded extends GsAttributeValueBase<GsAttributeEncodedValueEnum> {...}
...

到目前为止一切顺利。现在我想基本上在属性枚举类型中创建一个工厂方法,以返回上述某个子类型的实例(因为每个属性都知道它的类型和范围),类似于

public GsAttributeValueBase<? extends Comparable<?>> CreateInstance()
{
  switch(m_format)
  {
  case SHORT: return new GsAttributeValueShort(...);
  case LONG: return new GsAttributeValueLong(...);
  case ENCODED: return new GsAttributeValueEncoded(...);
  ...
  }
}

并将方法调用为:

GsAttributeValueShort = GsAttributeEnum.AAH.CreateInstance();

这是我撞墙的地方;我按照

的顺序得到了一个不兼容的类型错误
found   : GsAttributeValueBase<capture of ? extends java.lang.Comparable<?>>
required: GsAttributeValueShort

到目前为止,我已经对CreateInstance()的声明尝试了大约十几种排列(它不能是静态的,因为它依赖于枚举实例的特定信息)。我此刻就要把头发撕掉了;我已经浪费了几天这个兔子洞,并且要么要么今天要工作要么完全放弃了。

我真的想做这项工作;我认为,不仅仅是这个项目,还有其他项目,这将是有价值的。但Java泛型不像C ++模板(过去一周被复仇的东西),我知道我在这里缺少一些重要的东西,但我看不出它是什么。

修改

我无法按照我想象的方式完成这项工作,而且我已经花了太多时间。感谢您的建议,但我会继续关闭它。

编辑2

喔。我无法解决自己的问题。那好吧。

2 个答案:

答案 0 :(得分:3)

怎么样:

public <T extends Comparable<T>> GsAttributeValueBase<? super T> CreateInstance() {
    ...
}

答案 1 :(得分:0)

只需使用地图和my TypeSafeMap pattern

关于泛型的一些想法:泛型是为了使集合类型安全。它们并不是真正用于复杂的事情,比如在运行时构建类型安全的类。所以要注意并使用你的工具,这样他们就不会成为负担。如果一个演员工作,你不明白泛型构造是如何工作的(即使你只是写了它),使用强制转换。想象一下,半年后回到这段代码并不得不修复它。