1

我对 java 非常陌生,并试图扩展 File 类以使用下面的类向它添加更多方法和属性

import java.io.File;

public class RecordingFile extends File {
private static final long serialVersionUID = -4774703382591639948L;
String RecordingNameFormatted;
String RecordingDurationFormatted;
String RecordingSizeFormatted;
String RecordingDateFormatted;
String RecordingBitrateFormatted;

public RecordingFile(String path) {
    super(path);
    File f = new File(path);
    RecordingNameFormatted = f.getName().replace(".mp3", "");
    RecordingDurationFormatted = Utils.millisecondsToHours(Utils.getMp3DurationPureJava(f));
    RecordingSizeFormatted = Utils.humanReadableByteCount(f.length(), true);
    RecordingDateFormatted = Utils.longToDate(f.lastModified());
    RecordingBitrateFormatted = Utils.getBitratePureJava(f) +"Kbps";
}
}

以上不能正常工作。我什至不确定是否

    File f = new File(path);

应该在那里。例如,当我尝试这个

ArrayList<RecordingFile> ret = new ArrayList<RecordingFile>();
    RecordingFile filesDir = new RecordingFile(path);
    if (!filesDir.exists()) {
        filesDir.mkdirs();
    }
    RecordingFile[] list = filesDir.listFiles();

Eclipse 告诉我“类型不匹配:无法从 File[] 转换为 RecordingFile[]”我如何才能通过添加更多属性/方法来扩展 File 类?

4

4 回答 4

4

内置的东西都不知道你的类,所以它们不可能返回你的新类型。我认为您正在寻找的可能是Java中尚不存在的扩展方法。

Java 等价于 C# 扩展方法

为了使用你的东西,你必须创建一个方法,给定任何 File 对象的集合,返回你的新类型。然后,您必须在要使用您的类型的任何地方调用它。

所以这条线看起来像

RecordingFile[] list = convertToRecordingFiles(filesDir.listfiles());

我将 convertToRecordingFiles 的实现留作练习 :)

于 2012-07-16T22:15:41.280 回答
1

问题是当您调用 listFiles() 时,您正在调用 File 方法 listFiles(),它返回一个 File 类型的数组。由于继承,您的 RecordingFile 类型是文件,但文件不是 RecordingFile。因此,当您现在调用 listFiles 时,没有问题,因为它返回一个 RecordingFiles 数组,其中是文件,但方法指定它们是文件类型。

如上所述,您可以编写一个将文件转换为 RecordingFiles 的实用程序方法。

或者,您可以只转换方法调用的结果,因为它返回的文件实际上是 RecordingFiles。因此将行更改为:RecordingFile[] list = (RecordingFile[])filesDir.listFiles();

在我看来,最干净的选择是在你的新类上重载方法:给 RecordingFile 一个方法 listFiles(),它返回一个 RecordingFiles 列表(提示:你可以完全按照我上面指定的方式编写方法)。

于 2012-07-16T22:23:02.383 回答
1

如果您正在扩展,File那么您的类实例也是 Files。调用超级构造函数就足够了,然后这将包含 File 的所有公共和受保护字段和方法以及您添加的任何内容。

于 2012-07-16T22:15:13.690 回答
1

在树视图中列出(虚拟)文件系统方面,我必须覆盖 File 类。所以我选择了 John 的答案来解决它。这是对以前从未覆盖过课程的人的一些帮助。

@Override
public MyFile[] listFiles() {
    File[] theFiles = super.listFiles();
    if (theFiles == null || theFiles.length == 0) return null;

    MyFile[] myFiles = new MyFile[theFiles.length];
    for (int i = 0; i < theFiles.length; i++) {
        myFiles[i] = new MyFile(theFiles[i].getAbsolutePath());
    }
    return myFiles;
}
于 2015-09-08T22:02:36.520 回答