在谈论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类并研究该类的两个重载构造函数时,我感到困惑。
- 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”确实为null,则this(name != null ? new File(name) : null);将评估为this(null);,这又等同于调用FileInputStream(null);,但是接下来FileInputStream(String)和FileInputStream(File)都成为使用null值调用的可能选择。这不会引起歧义吗?因此,编译时是否会出现错误?
我确实理解最终会引发FileNotFoundException,但这是一个后续问题。那么在此之前如何解决歧义呢?
a ? b : c
的返回类型,在这种情况下为java.io.File
,因此没有歧义。问题并不是两个建议中的任何一个的重复。 - Erwin Bolwidt