【问题标题】:Java MyFile extends FileJava MyFile 扩展文件
【发布时间】:2012-07-15 19:59:36
【问题描述】:

我对 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 类?

【问题讨论】:

  • 即使是 C# 程序员也应该在 java 中将他们的变量名写成小写。 ;)

标签: java extends


【解决方案1】:

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

Java equivalent to C# extension methods

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

所以这条线看起来像

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        @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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-22
          • 2012-06-11
          • 2015-10-20
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多