在谈论 FileInputStream 之前,我先从一个场景开始,其中有两个完全有效的重载方法,但编译器会感到困惑,然后在响应某些输入时报告编译时错误。
以下是方法。
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 类并研究该类的两个重载构造函数时,这就是我感到困惑的地方。
- 公共文件输入流(字符串名称)抛出 FileNotFoundException {.....}
- 公共 FileInputStream(文件文件)抛出 FileNotFoundException {.....}
根据 Java 7 API 源代码,以 String 对象为参数的版本的定义是:
public FileInputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null);
}
现在,如果“ name ”确实为空,则 this(name != null ? new File(name) : null); 评估为this(null); 这又相当于调用FileInputStream(null); 但随后FileInputStream(String)和FileInputStream(File)都成为使用空值调用的可能选择。它不会引起歧义吗?那么,是否存在编译时错误?
我确实理解最终会引发 FileNotFoundException,但这是一个单独的问题,稍后会出现。在此之前如何解决歧义?