这是一个如此简单,精彩的想法。使用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
喔。我无法解决自己的问题。那好吧。
答案 0 :(得分:3)
怎么样:
public <T extends Comparable<T>> GsAttributeValueBase<? super T> CreateInstance() {
...
}
答案 1 :(得分:0)
只需使用地图和my TypeSafeMap pattern。
关于泛型的一些想法:泛型是为了使集合类型安全。它们并不是真正用于复杂的事情,比如在运行时构建类型安全的类。所以要注意并使用你的工具,这样他们就不会成为负担。如果一个演员工作和,你不明白泛型构造是如何工作的(即使你只是写了它),使用强制转换。想象一下,半年后回到这段代码并不得不修复它。