扩展File类时遇到ClassCastException问题

时间:2014-03-10 15:40:48

标签: java arrays casting

我有一个小但很难找到有关我自己的MyFile类扩展File类的问题。关键是要创建一个递归查找文件夹树中的文件的方法。但是,在偶然发送到MyFile的文件上调用类型为MyFile的listFilesRecurse()时,我偶然发现了一个ClassCastException问题。我一直在考虑我的approch,遗憾的是它似乎很合理......我很感激你们中的某些人帮助过我。

public class MyFile extends File {

    public MyFile(String  s) {
        super(s);
    }

    public List <File> listFilesRecurse() {
        List <File> finalList = new ArrayList<File>();

        File [] tab =   this.listFiles();
        for (File tab1 : tab) {
            if (tab1.isFile()) {
                finalList.add(tab1);
            } else if (tab1.isDirectory()) {
                ((MyFile) tab1).listFilesRecurse();
            }
        }

    return finalList;
    }
}

我没有意识到继承规则,现在我想出了一个有效的版本。

public class MyFile {

String path;
public MyFile (String path) {
    this.path = path;
}

List <File> list = new ArrayList<File> ();
List <String> nameList = new ArrayList <String> ();

 List <File> listFilesRecusive() {

    File f = new File(path);

    File [] files = f.listFiles();

    for (File fil : files) {

        String subFile = fil.getName();

        if (fil.isFile()) {
        list.add(fil);
        nameList.add(fil.getName());
    } else if (fil.isDirectory()) {
        this.path = fil.toString();
        this.listFilesRecusive();

    }
    }
    return list;
}

5 个答案:

答案 0 :(得分:4)

你所做的事实际上并没有多大意义。

当你这样做时

this.listFiles();

它实际上是从基类方法返回真正的File实例。基类不知道你创建了一个派生类,它返回的文件实例不可能被转换为派生类。

可能的解决方案

您可以使用构造函数从现有文件创建MyFile,但是转换是不可能的。因此,在MyFile中创建一个构造函数,它接受一个File实例,并使用它而不是强制转换。

答案 1 :(得分:2)

java.io API对您的课程一无所知。 (继承)方法listFiles()返回File个对象。这一行:

((MyFile) tab1).listFilesRecurse();
由于File不是MyFile

的广播会失败。

要使您的想法“正常”,您必须覆盖listFiles()(以及返回File个对象的所有其他方法)以返回MyFile个对象。

答案 2 :(得分:1)

您从FileMyFile投降。这就是ClassCastException

的原因

您可以通过首先在循环迭代中创建MyFile对象然后再使用它来解决此问题。

我想您可能想重新思考为什么要首先扩展File,而是通过静态方法或组合提供实用程序。

答案 3 :(得分:0)

File不是MyFile

方法.listFiles()返回File列表,错误是正确的。

答案 4 :(得分:0)

class A {
}

class B extends A {
}

A a = new B();
B b = (B) a;

有效,但是:

A a = new A();
B b = (B) a;

将抛出ClassCastException