我是非常非常新的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类?
答案 0 :(得分:4)
没有内置的东西知道你的课程,所以他们不可能返回你的新类型。我认为你正在寻找的可能是扩展方法,它们在Java中还不存在。
Java equivalent to C# extension methods
为了使用你的东西,你必须创建一个方法,给定任何File对象的集合,返回你的新类型。然后,您必须在任何想要使用类型的地方调用它。
这条线看起来像
RecordingFile[] list = convertToRecordingFiles(filesDir.listfiles());
我将convertToRecordingFiles的实现留作练习:)
答案 1 :(得分:1)
如果您要延长File
,那么您的班级实例也是 File
。调用超级构造函数就足够了,然后这将包含所有公共和受保护的字段&amp;文件的方法加上你添加的任何内容。
答案 2 :(得分:1)
问题是当你调用listFiles()时,你正在调用File方法listFiles(),它返回一个File类型的数组。 由于继承,您的RecordingFile类型是IS A文件,但文件不是RecordingFile。因此,当您现在调用listFiles时,没有问题,因为它返回了一个记录文件阵列,其中包含ARE Files,但方法指定它们是文件类型。
如上所述,您可以编写一个将文件转换为RecordingFiles的实用程序方法。
或者,您可以只转换方法调用的结果,因为它返回的File实际上是RecordingFiles。 所以将行改为: RecordingFile [] list =(RecordingFile [])filesDir.listFiles();
在我看来,最干净的选择是重载新类的方法:给RecordingFile一个方法listFiles(),它返回一个RecordingFiles列表(提示:你可以按我上面指定的方式编写方法)。