2011-12-30 4 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, но это не делает FileMyMusicFile. Если перечислить все супер-классы для каждого класса, вы получите:

  • Файл: java.lang.Object
  • MyMusicFile: java.io.File, java.lang.Object

И вы можете присвоить любой тип его типу или любому другому супер-типу (скажем Object - File или файл MyMusicFile).

Вы можете думать об этом следующим образом: MyMusicFile имеет все поля и методы, например File, а также некоторые дополнительные. Поэтому можно присвоить экземпляр MyMusicFileFile, потому что он будет работать (имеет все необходимые материалы), но у File нет всего материала MyMusicFile (что лишний материал отсутствует), поэтому он не будет работать ,

+1

+1. Ваш ответ яснее моего. –

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(); 
} 
Смежные вопросы