22

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 つのオーバーロードされたコンストラクターについて調べると、混乱します。

  1. public FileInputStream(String name) は FileNotFoundException をスローします {.....}
  2. 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 が発生することは理解していますが、それは後で発生する別の問題です。その前に、あいまいさはどのように解決されますか?

4

2 に答える 2

18

あなたのエラーはここにあります:

ここで、「name」が実際に null の場合は、次の呼び出しと同等であるとthis(name != null ? new File(name) : null);評価されますthis(null);FileInputStream(null);

実際には評価されます。this((File) null)つまり、明示的に として型指定された null 値Fileです。これは、式name != null ? new File(name) : nullに型が必要であり、その型が 2 つの選択肢の中で最も具体的な型であるためです。この場合、1 つの選択肢は として入力され、もう 1 つの選択肢は としてFile入力されるnullため、最も具体的な一般的なタイプはFileです。

そのため、明確にFileInputStream(File)コンストラクターに解決できます。これは次のようになります。

File file = null;
new FileInputStream(file);
于 2014-06-26T07:31:27.737 に答える