FileInputStream について説明する前に、オーバーロードされた 2 つの完全に有効なメソッドがあるにもかかわらず、コンパイラが混乱し、特定の入力に応答してコンパイル時エラーを報告するシナリオから始めます。
メソッドは次のとおりです。
double calcAverage(double marks1, int marks2) {
return (marks1 + marks2)/2.0;
}
double calcAverage(int marks1, double marks2) {
return (marks1 + marks2)/2.0;
}
メソッドの使用を示す完全なコードは次のとおりです。
class MyClass {
double calcAverage(double marks1, int marks2) {
return (marks1 + marks2)/2.0;
}
double calcAverage(int marks1, double marks2) {
return (marks1 + marks2)/2.0;
}
public static void main(String args[]) {
MyClass myClass = new MyClass();
myClass.calcAverage(2, 3);
}
}
int リテラル値は double 型の変数に渡すことができるため、どちらのメソッドもリテラル値2および3の候補として受け入れられるため、コンパイラはどちらのメソッドを選択するかを決定できません。
ここで、上記の概念を取り上げて、Java 7 API を FileInputStream クラスにさらに掘り下げ、そのクラスの 2 つのオーバーロードされたコンストラクターについて調べると、混乱します。
- public FileInputStream(String name) は FileNotFoundException をスローします {.....}
- public FileInputStream(File file) が FileNotFoundException をスローする {.....}
Java 7 API ソース コードによると、引数として String オブジェクトを取るバージョンの定義は次のとおりです。
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}
ここで、「name」が実際に null の場合、this(name != null ? new File(name) : null); this(null)に評価されます。これは、 FileInputStream(null);の呼び出しと同等です。ただし、FileInputStream(String)とFileInputStream(File)の両方が、null 値で呼び出される可能性のある選択肢になります。曖昧さを生みませんか?それで、そのためのコンパイル時エラーはありませんか?
最終的に FileNotFoundException が発生することは理解していますが、それは後で発生する別の問題です。その前に、あいまいさはどのように解決されますか?