Java 扩展文件类时出现ClassCastException问题

Java 扩展文件类时出现ClassCastException问题,java,arrays,casting,Java,Arrays,Casting,我有一个很小的问题,但对于我来说太难找到关于用我自己的MyFile类扩展File类的问题。关键是要创建一个方法,在文件夹树中递归查找文件。然而,我偶然发现了一个问题,在对转换为MyFile的文件调用MyFile类型的ListFileRecurse时出现了ClassCastException。我一直在考虑我的方法,不幸的是,它似乎很合理。。。如果你们中有人帮助我,我会非常感激的 public class MyFile extends File { public MyFile(String

我有一个很小的问题,但对于我来说太难找到关于用我自己的MyFile类扩展File类的问题。关键是要创建一个方法,在文件夹树中递归查找文件。然而,我偶然发现了一个问题,在对转换为MyFile的文件调用MyFile类型的ListFileRecurse时出现了ClassCastException。我一直在考虑我的方法,不幸的是,它似乎很合理。。。如果你们中有人帮助我,我会非常感激的

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;
}
文件不是MyFile

方法.listFiles返回文件列表,错误是正确的。

文件不是MyFile

方法.listFiles返回一个文件列表,错误是正确的。

java.io API对您的类一无所知。继承的方法listFiles返回文件对象。这一行:

((MyFile) tab1).listFilesRecurse();
由于文件不是MyFile而导致强制转换失败

要使您的想法发挥作用,您必须重写listFiles和所有其他返回文件对象的方法,以返回MyFile对象。

java.io API对您的类一无所知。继承的方法listFiles返回文件对象。这一行:

((MyFile) tab1).listFilesRecurse();
由于文件不是MyFile而导致强制转换失败

要使您的想法发挥作用,您必须覆盖listFiles和所有其他返回文件对象的方法,而不是返回MyFile对象。

您所做的实际上没有太多意义

当你这样做的时候

this.listFiles();
它实际上是从基类方法返回真实的文件实例。基类不知道您创建了一个派生类,并且它返回的文件实例不可能被强制转换为派生类

可能的解决办法

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

您所做的实际上没有太多意义

当你这样做的时候

this.listFiles();
它实际上是从基类方法返回真实的文件实例。基类不知道您创建了一个派生类,并且它返回的文件实例不可能被强制转换为派生类

可能的解决办法

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

您正在从一个文件强制转换到另一个MyFile。这就是ClassCastException的原因

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

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

您正在从一个文件转换到另一个MyFile。这就是ClassCastException的原因

class A {
}

class B extends A {
}

A a = new B();
B b = (B) a;
您可以通过首先在循环迭代中创建MyFile对象,然后使用它来解决这个问题

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

class A {
}

class B extends A {
}

A a = new B();
B b = (B) a;
有效,但:

A a = new A();
B b = (B) a;
将抛出ClassCastException

有效,但:

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

将抛出ClassCastException。

Cast不会将对象从一个类转换为另一个类。它所做的只是断言对象属于该类或该类的子类。如果该断言不真实,则会得到ClassCastException.Cast不会将对象从一个类转换为另一个类。它所做的只是断言对象属于该类或该类的子类。如果该断言不正确,您将得到ClassCastException。非常感谢您的帮助,我认为'this'指的是MyClass对象,而'super'关键字指的是基类:顺便说一句:那么我应该如何访问我调用方法的对象的唯一参数呢?我应该在类中创建一些字段还是什么?非常感谢您的帮助,我认为'this'指的是MyClass对象,而'super'关键字指的是基类:顺便说一句:那么我应该如何访问我调用方法的对象的唯一参数呢?我应该在类中创建一些字段还是什么?谢谢,我忘记了继承的机制,但是在重写方法方面-我知道怎么做,只是出于好奇-有没有办法使用Eclipse查看预定义方法的源代码?是的,您可以通过下载和安装JDK并将其用作Eclipse运行时来查看源代码,然后将src.zip附加为SourceThank,我忘记了继承的机制,但是在重写方法方面——我知道怎么做,只是出于好奇——有没有办法使用Eclipse查看预定义方法的源代码?是的,您可以通过下载和 安装JDK并将其用作Eclipse运行时,然后附加src.zip作为源代码