Java 将API类强制转换为继承的类
为什么下面的方法行不通?这样的演员不可能吗 我得到错误:Java 将API类强制转换为继承的类,java,inheritance,Java,Inheritance,为什么下面的方法行不通?这样的演员不可能吗 我得到错误:java.lang.ClassCastException:java.io.File无法强制转换为MyMusicFile public class MyMusicFile extends java.io.File { public MyMusicFile(String pathname) { super(pathname); } public String artist; public String album
java.lang.ClassCastException:java.io.File无法强制转换为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;
}
不,不可能。如果你想把马扔到汽车上,你会得到什么?你可能只会把某个东西变成它实际上是的东西。例如,以下是确定的:
Object o = new Integer(345);
Integer i = (Integer) o;
Number n = (Number) o;
因为
o
变量引用的对象是一个整数,也是一个数字,也是一个对象。如果MyMusicFile
扩展了File
,那么MyMusicFile
也是一个文件,但这并不能使File
成为MyMusicFile
。如果列出每个类的所有超级类,您将得到:
- 文件:java.lang.Object
- MyMusicFile:java.io.File,java.lang.Object
您可以将任何类型分配给它的类型或任何其他超级类型(例如,将对象
分配给文件
,或将文件分配给MyMusicFile
)
您可以这样想:MyMusicFile
包含所有字段和方法,如File
,以及一些额外的字段和方法。因此,将MyMusicFile
的实例分配给文件是安全的,因为它可以工作(包含所有必需的内容),但是文件没有MyMusicFile
的所有内容(缺少额外的内容),因此它不会工作 其他答案完全正确,但我也应该指出,Java中的某些类不是为满足大多数用户需求而设计的子类,而Java.io.File
就是其中之一。您只需创建一个引用所需文件的文件对象。子类化的目的是向原始类添加额外的行为,而这对于文件来说通常不是必需的。正如其他人所解释的,您的代码不起作用,因为虽然MyMusicFile是一个文件,但相反的情况并不正确(文件不是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();
}