2011-12-30 93 views
0

爲什麼以下方法不起作用?難道不可能這樣嗎?將API類轉換爲繼承類

我得到的錯誤: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; 
} 

回答

2

不,這是不可能的。如果你試圖將馬投入汽車,你會得到什麼?你可能只會將某些東西投射到實際的東西上。例如,以下是確定:

Object o = new Integer(345); 
Integer i = (Integer) o; 
Number n = (Number) o; 

由於對象,所述o變量引用是一個整數,這也是一個數,這也是一個對象。

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

+1。你的答案比我的更清楚。 – 2011-12-30 22:01:20

1

其他答案是完全正確的,但我也應該指出,Java中的某些類不是爲大多數用戶需求進行子類化設計的,java.io.File就是其中之一。您只需創建一個指向您所需文件的File對象。子類的目的是爲原始類添加額外的行爲,而這通常對於文件不是必需的。

0

正如其他人已經解釋,你的代碼不起作用,因爲雖然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(); 
}