每个优秀的程序员都喜欢编写简洁但有效且经过优化的代码。 类型推断是JDK 7中引入的一种方法,它肯定会为您带来更少键入的好处。 您以以下方式使用Java代码已有很长时间了。

但是,在初始化Collections的特定实现时,您是否曾经想到过代码重复? 为什么在初始化期间需要两次写入参数?

List<string> names = new ArrayList<string>();
Map<string, Object> objectMap = new HashMap<string, Object>();
现在,大多数人都将考虑像在以前的JDK版本中一样将其初始化为原始类型。

这样的东西。

List<string> names = new ArrayList();
Map<string, object=""> objectMap = new HashMap();

那么JDK 7中有什么新功能? 您将从新功能中获得什么好处?
因此,首先我们需要了解原始类型和通用类型初始化之间的区别。

这样的语句可确保实现包含初始化期间指定的相同参数。

List<string> names = new ArrayList<string>();

在以下示例中,编译器生成未经检查的转换警告,因为HashMap()构造函数引用的是HashMap原始类型,而不是Map<String, List<String>>类型:

Map<String, List<String>> myMap = new HashMap(); // unchecked conversion warning

钻石算子
 
好的,现在我将介绍JDK 7的新功能。 因此,JDK 7中有一个称为Diamond运算符的东西,它可以减少初始化时的额外键入。

句法:

List<string> names = new ArrayList<>();

因此,它不仅减少了您的代码,而且确保了类型检查。
这是一个更清晰的示例,解释了类型推断的好处。

高级示例:

class Demo {
void printStudentNames(List<string> names) {
for(String name:names) {
System.out.println("String name:"+name);
}
}public static void main(String[] args) {
Demo demo = new Demo();
demo.printStudentNames(new ArrayList<>());   // It saved typing here in a method call too.
List<string> names = new ArrayList<>();
printStudentNames(names);
List<string> copyOfNames = new ArrayList<>(names);  // It saved typing here in a copy contructor invocation too.
}
}

现在有什么限制?
如果您使用通配符,它​​将不起作用。

像这样

Class Tree<t> {public void demoFunction(List<t> objList) {
List<t> copyOfNames = new ArrayList<t>(objList);   //This is not gonna work.
}
}

在上述情况下,在复制构造函数中传递的参数应为Collection <? 扩展T>
因此它不会接受上述推断类型。

参考: 为什么我们需要Java 7中的类型推断? 来自我们的JCG合作伙伴 Saurab Parakh在Coding is Cool博客上。

翻译自: https://www.javacodegeeks.com/2012/05/type-inference-from-java-7.html

Java 7的类型推断相关推荐

  1. Java中的类型推断和lambda表达式

    文章目录 简介 类型的显示使用 Stream中的类型推断 类型推断中变量名字的重要性 类型推断对性能的影响 类型推断的限制 总结 简介 java是强类型的编程语言,每个java中使用到的变量都需要定义 ...

  2. Java 10 –局部变量类型推断

    在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能. 从Java的第一个版本开始,它是一种强类型语言,在这里我们需要提 ...

  3. java泛型函数类型推断_为什么javac可以推断用作参数的函数的泛型类型参数?

    在下面的示例中,为什么编译器能够推断出在Foo.test()中第一次调用Foo.create()的通用参数,但是在第二个样例中却不能这么做?我正在使用 Java 6. public class Non ...

  4. Java 10 实战第 1 篇:局部变量类型推断

    现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了. 今天要实战的是 Java 10 中最重要的特性:局部变量 ...

  5. Java 8新特性探究(6):泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...

  6. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  7. Java 8 - 04 类型检查、类型推断以及限制

    文章目录 Pre 类型检查 同样的 Lambda,不同的函数式接口 菱形运算符 特殊的void兼容规则 类型推断 使用局部变量 Pre 当我们第一次提到Lambda表达式时,说它可以为函数式接口生成一 ...

  8. scala类型推断及库方法设计原则和==与java有何差别

    scala类型推断 方法msortSwapped(abcd)(_>_) 通常,一旦有需要推断多台方法类型参数的任务时,类型推断器就只参考第一个参数列表中所有参数类型,但不会参考之后其他参数.因为 ...

  9. java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

    java中无法推断类型参数 最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: ...

最新文章

  1. 软件测试黑盒测试实验心得_软件测试的基础知识
  2. 用JDK自带的监控工具jconsole来监控程序运行
  3. Spring控制器响应(action)请求的几种处理方式,如返回JSON,MODEL MODELVIEW,STRING
  4. 获取一个对象的属性/属性值,以及动态给属性赋值
  5. innerHTML与innerText
  6. 王道计算机考研 数据结构 (查找-上)
  7. 基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现
  8. 2017.7.26 奇怪的道路 失败总结
  9. 七牛云 转码_开发者选择短视频SDK,为何青睐七牛云?
  10. 开始我们的Snippets!
  11. 四大顶级开源网络管理工具详解
  12. iptables 学习笔记 一 要领入门
  13. 计蒜客 2016计蒜之道比赛 初赛第四场 记录
  14. 省市三级联动(数据库)
  15. C语言自由落体程序咋写,C语言实现 小球自由落体问题
  16. Linux隧道isatap(sit模式)
  17. 《跃迁:成为高手的技术》读后感
  18. python风控模型举例_一文搞定风控模型6大核心指标(附代码)
  19. mysql57免安装教程_mysql5.7免安装版配置教程
  20. 广告投放中的预算问题

热门文章

  1. apache derby_Apache Derby数据库JVM安全策略
  2. java第三阶段源代码_有效Java第三版的源代码已更新为使用较新的功能
  3. junit 测试执行顺序_JUnit 5中的测试执行顺序
  4. spring @lazy_Spring @Lazy批注用例
  5. kafka数据到flume_大数据摄取:Flume,Kafka和NiFi
  6. 使用sstableloader恢复Cassandra Priam备份
  7. 鸡肉和鸡蛋–测试前解决Spring属性
  8. Java 11:将集合转换为数组
  9. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等
  10. Spring Cloud配置–外部化应用程序配置