关于Java 7 API中FileInputStream的两个重载构造函数的有趣之处
在谈论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 的可接受候选项,因此编译器无法决定选择哪种方法。
当我带着上面的概念,进一步深入研究FileInputStream类的Java 7 API,并研究该类的两个重载构造函数时,这就是我感到困惑的地方。
- public FileInputStream(String name) throws FileNotFoundException {.....}
- public FileInputStream(File file) throws 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,但这是一个单独的问题,稍后会出现。在此之前,如何解决歧义?