将API类转换为Inherited类

时间:2011-12-30 21:46:30

标签: java inheritance

为什么以下不起作用?这样投不可能吗?

我收到错误: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;
}

4 个答案:

答案 0 :(得分:5)

如果MyMusicFile延伸File,则MyMusicFile也是File,但这不会使File成为MyMusicFile。如果列出每个班级的所有超级课程,您将获得:

  • 文件:java.lang.Object
  • MyMusicFile:java.io.File,java.lang.Object

您可以为其类型或任何其他超类型指定任何类型(例如ObjectFile,或文件至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();
}