当前位置: 首页 > 知识库问答 >
问题:

Java 7 API中FileInputStream的两个重载构造函数的有趣之处

隆谦
2023-03-14

在讨论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 7API并研究该类的两个重载构造函数时,我感到困惑的地方。

  1. Public FileInputStream(字符串名称)引发FileNotFoundException{.....}
  2. Public FileInputStream(File File)抛出FileNotFoundException{.....}

根据Java 7 API源代码,以String对象为参数的版本定义为:

public FileInputStream(String name) throws FileNotFoundException {  
       this(name != null ? new File(name) : null);  
} 

现在,如果“name”确实为null,则这个(name!=null?new File(name):null);求值为this(null);这又相当于对FileInputStream(null)的调用;但是FileInputStream(String)和FileInputStream(File)都成为可能的选择,可以使用null值进行调用。难道这不会引起歧义吗?那么,难道没有编译时错误吗?

我知道最终会提出一个FileNotFoundException,但这是一个单独的问题,以后才会出现。在此之前的歧义是如何解决的?

共有1个答案

钱建本
2023-03-14

您的错误在这里:

现在,如果“name”确实为null,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);
 类似资料:
  • null 我不太确定如何处理我的代码,以下是我得到的: 我只是不知道我应该打什么。我相信我已经完成了第一个重载构造函数,但我对此还是新手。 那么,我应该做些什么来使重载构造函数工作呢? 我对Java和面向对象编程非常陌生。

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 本文向大家介绍C++中构造函数重载,包括了C++中构造函数重载的使用技巧和注意事项,需要的朋友参考一下   当类中没有定义构造函数时,C++编译器自动提供无参构造函数和拷贝构造函数   当类中定义了任意的拷贝构造函数,C++不提供无参构造函数。 系统自动提供的构造函数   无参构造函数      函数体为空   拷贝构造函数      简单的进行成员变量的值复制      Test t1;    

  • 本文向大家介绍解析C++中构造函数的默认参数和构造函数的重载,包括了解析C++中构造函数的默认参数和构造函数的重载的使用技巧和注意事项,需要的朋友参考一下 C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。 【例】 程序运行结果为: 程序中对构造函数的定义(第12-16行)也可以改写成参数初始化

  • 假设我们有以下简单的代码: 这段代码使用clang编译并打印“T”,但使用gcc我们有以下错误: 我的问题是哪个编译器有bug,gcc还是叮当声?