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にはまだ存在しない拡張メソッドです。

C#拡張メソッドと同等のJava

自分のものを使用するには、Fileオブジェクトのコレクションが与えられると、新しい型を返すメソッドを作成する必要があります。次に、代わりにタイプを使用するすべての場所でそれを呼び出す必要があります。

その線は次のようになります

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

私はconvertToRecordingFilesの実装を演習として残します:)

于 2012-07-16T22:15:41.280 に答える
1

拡張しているFile場合、クラスインスタンス Filesです。スーパーコンストラクターを呼び出すだけで十分です。これにより、Fileのすべてのパブリックフィールドと保護されたフィールドとメソッドに加えて、追加したものがすべて含まれます。

于 2012-07-16T22:15:13.690 に答える
1

問題は、listFiles()を呼び出すときに、FileメソッドlistFiles()を呼び出していることです。これにより、ファイルタイプの配列が返されます。継承のため、RecordingFileタイプはファイルですが、ファイルはRecordingFileではありません。したがって、ここでlistFilesを呼び出すと、ファイルであるRecordingFilesの配列が返されるため問題はありませんが、メソッドはそれらがファイルタイプであることを指定します。

上で提案したように、ファイルをRecordingFilesに変換するユーティリティメソッドを作成できます。

または、メソッド呼び出しの結果をキャストすることもできます。これは、返されるファイルが実際にはRecordingFilesであるためです。したがって、行を次のように変更します。RecordingFile [] list =(RecordingFile [])filesDir.listFiles();

私の意見では、最もクリーンな選択は、新しいクラスのメソッドをオーバーロードすることです。RecordingFileにRecordingFilesのリストを返すメソッドlistFiles()を指定します(ヒント:上記で指定した方法でメソッドを記述できます)。

于 2012-07-16T22:23:02.383 に答える
1

ツリービューに(仮想)ファイルシステムをリストするという点では、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;
}
于 2015-09-08T22:02:36.520 に答える