首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataRow转换为强类型DataRow

将DataRow转换为强类型DataRow
EN

Stack Overflow用户
提问于 2012-05-07 11:45:56
回答 1查看 744关注 0票数 1

我有一个扩展DataRow的类

代码语言:javascript
复制
import org.jdesktop.dataset.DataRow;

public class MainDataRow extends DataRow {
  private MainDataTable baseDataTable;

  protected MainDataRow(MainDataTable dt) {
    super(dt);
    this.baseDataTable = dt;
  }

  public int    getId()                           { return (int)    super.getValue(baseDataTable.getColId()); };
  public void   setId(int id)                     {                 super.setValue(baseDataTable.getColId(), id); };
  public int    getDelta()                        { return (int)    super.getValue(baseDataTable.getColDelta()); };
  public void   setDelta(int delta)               {                 super.setValue(baseDataTable.getColDelta(), delta); };
  public String getNombre()                       { return (String) super.getValue(baseDataTable.getColNombre()); };
  public void   setNombre(String nombre)          {                 super.setValue(baseDataTable.getColNombre(), nombre); };

另外,MainDataTable扩展了DataTable,并返回getColId()getColDelta()getColNombre()的有效列。

我想做的是:

代码语言:javascript
复制
MainDataTable dt = new MainDataTable(ds);
MainDataRow dr = (MainDataRow) dt.appendRow();

但这是不可能的,因为有一个CastClassException (dt.appendRow返回DataRowMainDataRow正在扩展DataRow,反之亦然,所以唯一的可能性可能是类似于DataRow dr = (DataRow) new MainDataRow(dt);)。

在c++中,它可以通过DataRowBuilder轻松地实现,在MainDataTable中覆盖NewRowFromBuilder(),并从DataRowBuilder In MainDataRow (Casting DataRow to Strongly-Typed DataRow: How do they do it?)中重写受保护的创建者。

我怎么能用Java做这件事?

编辑

MainDataTable类:

代码语言:javascript
复制
public class MainDataTable extends TypedDataTable<MainDataRow> {
...
}

和TypedDataTable类:

代码语言:javascript
复制
public abstract class TypedDataTable<TypeOfRow> extends DataTable {
  protected boolean locked;

  public TypedDataTable(DataSet ds, boolean appendRowSupported) {
    super(ds);
    InitClass();
    super.setAppendRowSupported(appendRowSupported);
    locked = false;
  }

  public Object clone() {
    try {
      return super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
      return null;
    }
  }

  @Override
  public abstract DataRow appendRow();
  @Override
  public abstract DataRow appendRowNoEvent();
  public abstract void InitVars();
  public abstract void InitClass();

  public boolean isLocked() {
    return locked;
  }

  public void setLocked(boolean locked) {
    this.locked = locked;
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 12:19:05

appendRow()中重写MainDataTable和appendRowNoEvent()以返回MainDataRow

代码语言:javascript
复制
public abstract class TypedDataTable<TypeOfRow extends DataRow> extends DataTable {
  protected boolean locked;

  public TypedDataTable(DataSet ds, boolean appendRowSupported) {
    super(ds);
    InitClass();
    super.setAppendRowSupported(appendRowSupported);
    locked = false;
  }

  public Object clone() {
    try {
      return super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
      return null;
    }
  }

 @Override
 public TypeOfRow appendRowNoEvent() {
     if (appendRowSupported) {
         TypeOfRow row = createDataRow(); //<-- HERE we create a MainDataRow!!!
         rows.add(row);
         return row;
     } else {
         return null;
     }
 }

 @Override
 public TypeOfRow appendRow() {
      return (TypeOfRow)super.appendRow();
 }

  public abstract TypeOfRow createDataRow();
  public abstract void InitVars();
  public abstract void InitClass();

  public boolean isLocked() {
    return locked;
  }

  public void setLocked(boolean locked) {
    this.locked = locked;
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10481515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档