簡體   English   中英

子類化泛型類型,從另一個類中的方法返回子類的實例

[英]Subclassing a generic type, returning instances of the subclass from a method in another class

這是一個簡單,絕妙的主意。 使用Java 5.0枚舉類型的功能來編碼數據字典的詳細信息(屬性名稱,類型,范圍,單位等),並創建用於設置和讀取屬性值(即屬性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

哦。 我無法回答自己的問題。 那好吧。

關於什么:

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

只需使用地圖和我的TypeSafeMap模式即可

關於泛型的一些想法:泛型用於使集合類型安全。 它們並不是真正用於復雜的事情,例如在運行時構建類型安全的類。 因此,請注意並使用您的工具,以免它們成為負擔。 如果強制轉換有效, 並且您不了解泛型構造的工作原理(即使您剛剛編寫過),也可以使用強制轉換。 試想一下,半年后會回到此代碼並必須對其進行修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM