在讨论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并研究该类的两个重载构造函数时,我会感到困惑。
根据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,但这是一个单独的问题,稍后会出现。在此之前如何解决歧义?
最佳答案
您的错误在这里:
实际上,它的计算结果为this((File) null)
,即明确键入为File
的空值。这是因为表达式name != null ? new File(name) : null
必须具有一个类型,并且该类型是两种选择中最具体的类型。在这种情况下,一种替代方法的类型为File
,另一种类型的类型为null
,因此最常见的常见类型是File
。
这就是为什么它能够将其明确解析为FileInputStream(File)
构造函数的原因。类似于:
File file = null;
new FileInputStream(file);