在谈论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类,并研究该类的两个重载构造函数。
根据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(文件)< / strong>成为可能使用null值调用的选项。它不会引起歧义吗?那么,是不是存在编译时错误?
我确实理解最终会引发FileNotFoundException,但这是一个单独的问题。在此之前如何解决歧义?
答案 0 :(得分:18)
您的错误在这里:
现在,如果&#34; name&#34;确实为空,
this(name != null ? new File(name) : null);
评估为this(null);
,而FileInputStream(null);
则相当于调用this((File) null)
它实际上评估为File
- 即显式键入name != null ? new File(name) : null
的空值。这是因为表达式File
必须具有类型,并且该类型是两个备选方案中最具体的类型。在这种情况下,一个替代方案键入为null
,另一个键入为File
,因此最具体的常见类型为FileInputStream(File)
。
这就是为什么它能够明确地将其解析为File file = null;
new FileInputStream(file);
构造函数的原因。它类似于:
{{1}}
答案 1 :(得分:15)
条件运算符的结果类型为File
。
JLS定义:
如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,那么条件表达式的类型就是引用类型。
因此,对于应该调用哪个构造函数没有任何歧义