在讨论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)抛出FileNotFoundException {.....}
  • 公共(public)FileInputStream(文件文件)抛出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,但这是一个单独的问题,稍后会出现。在此之前如何解决歧义?

    最佳答案

    您的错误在这里:



    实际上,它的计算结果为this((File) null),即明确键入为File的空值。这是因为表达式name != null ? new File(name) : null必须具有一个类型,并且该类型是两种选择中最具体的类型。在这种情况下,一种替代方法的类型为File,另一种类型的类型为null,因此最常见的常见类型是File

    这就是为什么它能够将其明确解析为FileInputStream(File)构造函数的原因。类似于:

    File file = null;
    new FileInputStream(file);
    

    10-07 19:24
    查看更多