我有一个小但很难找到有关我自己的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;
}
答案 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)
您从File
向MyFile
投降。这就是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
。