静态/抽象冲突

static / abstract conflict

我有一个抽象 class (AveragedDataRecord),我需要进一步抽象它 (DataRecord),这样我就可以将它扩展到原来的 class 和一个新的具体 class ( SummedDataRecord),我在获取一些方法时遇到了问题,这些方法要从原始抽象 class 转换为新的超级 class.

public abstract class DataRecord{
  protected abstract DataRecord getFirstRecord(ArrayList<T> dataList);
  protected abstract DataRecord getLastRecord(ArrayList<T> dataList);

  protected DateTime getFirstRecordTimestamp(ArrayList<T> dataList){
    DateTime result   = new DateTime(DEFAULT_DATETIME);
    DataRecord record = this.getFirstRecord(dataList);
    if(null != record)
      result = record.getRecordDateTime();
    return result;
  }

  protected DateTime getLastRecordTimestamp(ArrayList<T> dataList){
    DateTime result   = new DateTime(DEFAULT_DATETIME);
    DataRecord record = this.getLastRecord(dataList);
    if(null != record)
      result = record.getRecordDateTime();
    return result;
  }
}

public abstract class AveragedDataRecord extends DataRecord<AveragedDataRecord> {
  public AveragedDataRecord getFirstRecord(ArrayList<AveragedDataRecord> dataList){
    // Implementation
  }

  public AveragedDataRecord getLastRecord(ArrayList<AveragedDataRecord> dataList){
    // Implementation
  }

  public static void myMethod(ArrayList<AveragedDataRecord> dataList){
    // beginning of method code
    fileWriter.write(itemA, itemB, **getLatestTimestamp(dataList)**);
    // end of method code
  }
}

我遇到的问题是上面提到的方法调用显示错误。 "quick fix" 建议 getLatestTimestamp() 需要是静态的。

使 getLatestTimestamp() 静态化会导致声明错误,因为 Java "cannot make static reference to non-static type T".

我一直在快速修复这个问题,但在我所属的论坛和 Google 上都没有发现任何关于这个特定问题的提及。我不敢相信我是唯一遇到过这种情况的人,但如果解决这个问题的方法就在那里,我还没有幸运地找到它。

如果您要在静态上下文中使用 getLatestTimeStamp(),即在静态方法中使用,则 getLatestTimeStamp() 必须是静态方法,这就是 快速修复 建议将 getLatestTimeStamp 方法标记为静态。另一方面,您可以创建 class 的实例,其中定义了 getLatestTimeStamp 方法,然后通过该引用访问 getLatestTimeStamp。

要在静态上下文中使用非静态方法,您必须通过引用访问非静态方法。

请记住,非静态字段不能在静态上下文中使用,除非通过引用。


将代码中的 getLatestTimestamp(dataList) 替换为以下内容:

    new /*/().getLatestTimestamp(dataList);

    // Replace /*/ with the name of the class in which getLatestTimestamp is created