静态/抽象冲突
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
我有一个抽象 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