2016-07-16 7 views
0

マイコード:java.io.Fileのは、カスタムクラスにキャストすることはできません

ソースのようなファイルを拡張するクラスです
FileChooser prompt = new FileChooser(); 
prompt.setTitle("Odaberi fajl"); 
source = (Source) prompt.showOpenDialog(new Stage()); 

import java.io.File; 

public class Source extends File { 

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

はにキャストしようとしてエラーを返しますソース。私は何が起こっているのか分かりません。

答えて

2

FileChooserは、Fileを返します。あなたはそれをSourceにキャストできると思いますか? Sourceではありません。 Source encasulate Fileを作成し、あなたが適切に含まれるFileに委任し、必要なものは何でもカスタムメソッドを提供

  1. :あなたが何をしたいか

    はの一つです。

    public class Source { 
        private File f; 
        public Source(File f) { 
         this.f = f; 
        } 
        // Custom methods 
        ... 
        // Delegating methods 
        public boolean exists() { 
         return f.exists(); 
        } 
        ... 
    } 
    
  2. あなたがやっているようFileを拡張しますが、別のFile(すなわち、コピーコンストラクタ)を取り、渡されたFileからのデータを使用してSourceをインスタンス化するコンストラクタを提供します。

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

次のように続いてインスタンス化:

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

あなたはキャストが何をするかを理解する必要があります。

キャスティングはコンパイル時の指令です。実行中の操作(あなたの場合はshowOpenDialog())がキャストと一致するオブジェクトを返すことをコンパイラに伝えます。それが真実でないと判明した場合、プログラムは実行時にIllegalCastExceptionを投げます。実行時にキャストが正しいことを確実にすることは、キャストを書き込むプログラマの責任です。多くの場合、コンパイラは正しい方法がないかどうかを教えてくれますが、すべての場合にあなたに伝えることはできません。

FileChooserSourceクラスの知識なしに書かれているため、Sourceオブジェクトを返すことはできません。キャストが成功した場合、(コンパイラによって)結果のオブジェクトのSourceからメソッドを呼び出すことが許可されますが、これは明らかに正しくありません。

鋳造について実現することの1つは、ボックス化されたプリミティブを含む非常に限定された状況を除いて、キャスティングはまったく参照されるオブジェクトを変更しないことです。その目的は、結果のクラスで操作が合法であることをコンパイラーに知らせることです。

これは、「エラーを返す」だけでなく、何が起こるかを質問するときに非常に役立ちます。それはコンパイルエラーか実行時エラーですか?エラーは何を言いますか?あなたが今後尋ねる質問のために覚えておいてください。

関連する問題