关于Java 7 API中两个重载的FileInputStream构造函数的一些有趣内容

时间:2014-06-26 06:56:06

标签: java constructor-overloading

在谈论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类,并研究该类的两个重载构造函数。

  1. public FileInputStream(String name)抛出FileNotFoundException {.....}
  2. public FileInputStream(File file)抛出FileNotFoundException {.....}
  3. 根据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,但这是一个单独的问题。在此之前如何解决歧义?

2 个答案:

答案 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)

条件运算符的结果类型为FileJLS定义:

  

如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,那么条件表达式的类型就是引用类型。

因此,对于应该调用哪个构造函数没有任何歧义