为什么以下不起作用?这样投不可能吗?
我收到错误:java.lang.ClassCastException: java.io.File cannot be cast to MyMusicFile
public class MyMusicFile extends java.io.File
{
public MyMusicFile(String pathname)
{
super(pathname);
}
public String artist;
public String album;
public String track;
public String year;
}
main(String[] args)
{
File file = new File("/home/1.txt");
MyMusicFile mmf = (MyMusicFile) file;
}
答案 0 :(得分:5)
如果MyMusicFile
延伸File
,则MyMusicFile
也是File
,但这不会使File
成为MyMusicFile
。如果列出每个班级的所有超级课程,您将获得:
您可以为其类型或任何其他超类型指定任何类型(例如Object
至File
,或文件至MyMusicFile
)。
您可以这样想:MyMusicFile
包含File
等所有字段和方法,以及一些额外的字段和方法。因此,将MyMusicFile
的实例分配给File
是安全的,因为它可以正常工作(包含所有必需的内容),但File
没有所有内容MyMusicFile
有(没有额外的东西),所以它不起作用。
答案 1 :(得分:2)
不,这是不可能的。如果你试图将一匹马投入汽车,你会得到什么?你可能只会把东西投射到它实际上的东西上。例如,以下是可以的:
Object o = new Integer(345);
Integer i = (Integer) o;
Number n = (Number) o;
因为o
变量引用的对象是一个Integer,它也是一个Number,也是一个Object。
答案 2 :(得分:1)
其他答案完全正确,但我也应该指出,Java中的某些类不是为大多数用户需求而设计的子类,而java.io.File
就是其中之一。您只需创建一个引用所需文件的File对象。子类化的目的是为原始类添加额外的行为,而文件通常不需要这样做。
答案 3 :(得分:0)
正如其他人所解释的那样,你的代码不起作用,因为MyMusicFile是一个文件,反之则不正确(File不是MyMusicFile)。您应该将设计从扩展名(is-a)更改为聚合(has-a)。像这样:
public class MyMusicFileReader {
private File musicFile;
public MyMusicFileReader(File file) {
super();
musicFile = file;
}
public void load() {
// load your info here
}
}
public static void main(String[] args) {
File file = new File("/home/1.txt");
MyMusicFileReader mReader = new MyMusicFileReader(file);
mReader.load();
}