当前位置:网站首页 > Java基础 > 正文

java推断教程



<p><em>类型推断</em>是Java编译器的能力,它能够查看每个方法调用和相应的声明,以确定使调用适用的类型参数(或参数)。推断算法确定参数的类型,如果可用,确定结果的类型(被赋值或返回)。最后,推断算法尝试找到适用于所有参数的<em>最具体</em>类型。</p> <p>为了说明这一点,考虑下面的例子,推断确定传递给<tt>pick</tt>方法的第二个参数的类型是<tt>Serializable</tt>:</p> <p>介绍了类型推断,它使您能够像调用普通方法一样调用泛型方法,而不需要在尖括号之间指定类型。考虑下面的例子,它需要类:</p> <p>以下是此示例的输出:</p> <p>泛型方法定义了一个名为的类型参数。一般来说,Java编译器可以推断泛型方法调用的类型参数。因此,在大多数情况下,您不需要指定它们。例如,要调用泛型方法,可以使用<em>类型目标</em>指定类型参数,如下所示:</p> <p>或者,如果省略类型见证,Java编译器会自动推断(从方法的参数中)类型参数为:</p> <p>您可以用一组空类型参数()替换调用泛型类构造函数所需的类型参数,只要编译器能够从上下文中推断出类型参数。这对尖括号在非正式的情况下被称为。</p> <p>例如,考虑以下变量声明:</p> <p>您可以用一组空类型参数(<tt>&lt;&gt;</tt>)替换构造函数的参数化类型:</p> <p>请注意,要在泛型类实例化过程中利用类型推断,您必须使用钻石。在以下示例中,编译器生成了一个未经检查的转换警告,因为构造函数引用了原始类型,而不是类型:</p> <p>请注意,构造函数可以在泛型和非泛型类中是泛型的(换句话说,声明自己的形式类型参数)。考虑以下示例:</p> <p>考虑对类进行实例化:</p> <p>这个语句创建了一个参数化类型的实例;语句明确为泛型类的形式类型参数指定了类型。请注意,这个泛型类的构造函数包含一个形式类型参数。编译器对这个泛型类的构造函数的形式类型参数推断出类型(因为这个构造函数的实际参数是一个对象)。</p> <p>从Java SE 7之前的版本开始,编译器能够推断泛型构造函数的实际类型参数,类似于泛型方法。然而,Java SE 7及更高版本的编译器可以推断正在实例化的泛型类的实际类型参数,如果你使用了 diamond()。考虑下面的例子:</p> <p>在这个例子中,编译器为泛型类的形式类型参数推断出类型。它为这个泛型类的构造函数的形式类型参数推断出类型。</p> <p>Java编译器利用目标类型来推断泛型方法调用的类型参数。表达式的目标类型是根据表达式出现的位置而Java编译器所期望的数据类型。考虑下面的方法的声明:</p> <p>考虑下面的赋值语句:</p> <p>这个语句期望一个的实例;这个数据类型就是目标类型。因为方法返回的是类型为的值,编译器推断类型参数必须是值。这在Java SE 7和8中都可以工作。或者你可以使用类型证明并指定的值,如下所示:</p> <p>然而,在这种情况下并不需要这样做。在其他情况下是必需的。考虑下面的方法:</p> <p>假设你想使用一个空列表调用方法。在Java SE 7中,下面的语句无法编译:</p> <p>Java SE 7编译器生成类似以下的错误消息:</p> <p>编译器需要类型参数的值,所以它从开始。因此,调用返回类型为的值,与方法不兼容。因此,在Java SE 7中,必须指定类型参数的值,如下所示:</p> <p>在Java SE 8中,这不再是必需的。目标类型的概念已经扩展到包括方法参数,例如方法的参数。在这种情况下,需要一个类型的参数。方法返回一个类型的值,因此使用的目标类型,编译器推断出类型参数的值为。因此,在Java SE 8中,以下语句可以编译通过:</p> <p>有关更多信息,请参见和。</p> 

  • 上一篇: java se高级教程
  • 下一篇: java 开源框架教程
  • 版权声明


    相关文章:

  • java se高级教程2025-10-18 19:26:05
  • java打枪教程2025-10-18 19:26:05
  • Java访问https教程2025-10-18 19:26:05
  • java重定向教程2025-10-18 19:26:05
  • java递归教程视频2025-10-18 19:26:05
  • java 开源框架教程2025-10-18 19:26:05
  • java自动排序教程2025-10-18 19:26:05
  • java前端教程pdf2025-10-18 19:26:05
  • java教程价格2025-10-18 19:26:05
  • jsf java教程2025-10-18 19:26:05