Преобразование класса API в наследуемый класс - PullRequest
0 голосов
/ 31 декабря 2011

Почему следующее не будет работать?Разве нельзя так разыгрывать?

Я получаю ошибку: 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 ]

5 голосов
/ 31 декабря 2011

Если MyMusicFile расширяет File, то MyMusicFile также является File, но это не делает File a MyMusicFile. Если вы перечислите все суперклассы для каждого класса, вы получите:

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

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

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

2 голосов
/ 31 декабря 2011

Нет, это невозможно. Что бы вы получили, если бы попытались бросить Лошадь в машину? Вы можете только привести что-то к чему-то, что на самом деле есть. Например, все в порядке:

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

Поскольку объект, на который ссылается переменная o, является Integer, который также является Number, который также является Object.

1 голос
/ 31 декабря 2011

Другие ответы совершенно верны, но я также должен отметить, что некоторые классы в Java не предназначены для создания подклассов для большинства потребностей пользователей, и java.io.File является одним из них. Вы просто создаете объект File, который ссылается на нужный файл. Задача создания подклассов заключается в добавлении дополнительного поведения к исходному классу, и это, как правило, не является обязательным для Файла.

0 голосов
/ 31 декабря 2011

Как объяснили другие, ваш код не работает, потому что, хотя 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...