2016-07-16 7 views
0

Mein Code:java.io.File kann nicht auf benutzerdefinierte Klasse geworfen werden

FileChooser prompt = new FileChooser(); 
prompt.setTitle("Odaberi fajl"); 
source = (Source) prompt.showOpenDialog(new Stage()); 

wo Quelle eine Klasse, die Datei als solche erstreckt:

import java.io.File; 

public class Source extends File { 

    public Source(String pathname) { 
     super(pathname); 
    } 
} 

einen Fehler zurückgibt, wenn sie versuchen zu werfen Quelle. Ich habe keine Ahnung, was das verursacht.

Antwort

2

FileChooser gibt eine File zurück. Was lässt dich denken, dass du es in Source umwandeln kannst? Es ist kein Source.

Was Sie tun möchten, ist eines der folgenden:

  1. Machen Source encasulate ein File und liefern, was benutzerdefinierte Methoden, die Sie benötigen, um die enthaltenen File Delegieren als angemessen.

    public class Source { 
        private File f; 
        public Source(File f) { 
         this.f = f; 
        } 
        // Custom methods 
        ... 
        // Delegating methods 
        public boolean exists() { 
         return f.exists(); 
        } 
        ... 
    } 
    
  2. Extend File wie Sie tun, aber einen Konstruktor zur Verfügung stellen, die eine andere File (das heißt einen Kopierkonstruktor) nimmt und instanziiert die Source die Daten aus dem übergebenen File verwenden.

    public class Source extends File { 
        public Source(File f) { 
         super(f.getAbsolutePath()); 
        } 
        // Custom methods 
        ... 
    } 
    

instanziiert dann wie folgt:

FileChooser prompt = new FileChooser(); 
prompt.setTitle("Odaberi fajl"); 
source = new Source(prompt.showOpenDialog(new Stage())); 
0

Sie müssen verstehen, was Guss der Fall ist.

Casting ist eine Kompilierzeitrichtlinie; Es teilt dem Compiler mit, dass die Operation, die ausgeführt wird (showOpenDialog() in Ihrem Fall), ein Objekt zurückgibt, das der Besetzung entspricht. Wenn das nicht wahr ist, wird das Programm zur Laufzeit einen IllegalCastException werfen. Es ist Sache des Programmierers, der den Cast schreibt, um sicherzustellen, dass der Cast zur Laufzeit korrekt ist. Der Compiler wird Ihnen sagen, ob es in vielen Fällen keine Möglichkeit gibt, dass es korrekt ist, aber nicht in allen Fällen.

FileChooser wurde ohne Wissen Ihrer Source Klasse geschrieben, so dass es nicht möglich ist, ein Source Objekt zurückzugeben. Wenn die Umwandlung erfolgreich gewesen wäre, würde es Ihnen (durch den Compiler) möglich sein, Methoden vom Source auf dem resultierenden Objekt aufzurufen, und das wäre eindeutig falsch.

Eine Sache, die man über das Casting wissen sollte, ist, dass Casting, abgesehen von sehr begrenzten Umständen, die Boxed-Primitive beinhalten, das angesprochene Objekt überhaupt nicht verändert. Sein Zweck besteht darin, dem Compiler mitzuteilen, dass Operationen für die resultierende Klasse zulässig sind.

Nebenbei hilft es enorm, wenn man eine Frage stellt, um zu sagen, was passiert, nicht nur "gibt einen Fehler zurück". Ist das ein Kompilierungs- oder Laufzeitfehler? Was sagt der Fehler? Bitte denken Sie daran, dass Sie für Fragen in der Zukunft fragen.

Verwandte Themen