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