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();
}