• 生产问题之泛型自动推断(JDK1.7新特性)


    今天提完代码,新来同事拉下代码后,如下代码出现异常:

    List<TblBlockMoneyDtl> transData = new ArrayList<>();

    分析原因后发现,他本地JDK版本为1.6,而JDK1.6是不支持泛型自动推断的,故会报错。

    关于泛型的自动推断,做以下复习总结:

    1、简单理解泛型

      如果你还不了解什么是泛型,请点击进入《泛型》详细情况地址:http://blog.csdn.net/sun_promise/article/details/51322239#t16

      泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量”。这种类型变量可以用在类、接口和方法的创建中。当然最常见的就是用在集合中。

      泛型可以节省某些Java类型转换(casting)上的操作:

    List<Apple> box = new ArrayList<Apple>();
    box.add(new Apple());
    Apple apple = box.get(0);

      分析:box是一个装有Apple对象的List。get()方法返回一个Apple对象实例,这个过程不需要进行类型转换。没有泛型,上面的代码需要写成这样:

    Apple apple = (Apple)box.get(0);

    2、泛型的尴尬

      泛型的最大优点是提供了程序的类型安全同时可以向后兼容,但尴尬的是每次定义时都要写明泛型的类型,这样在显示指定上不仅感觉有些冗长,最主要是很多程序员不熟悉泛型,因此很多时候不能够给出正确的类型参数,现在通过编译器自动推断泛型的参数类型,能够减少这样的情况,并提高代码可读性。

    3、Java7的泛型类型推断产生

      在以前的版本中使用泛型类型,需要在声明并赋值的时候,两侧都加上泛型类型。

    Map<String, String> myMap = new HashMap<String, String>();

      你可能觉得:在声明变量的的时候已经指明了参数类型,为什么还要在初始化对象时再指定?

      幸好,在Java SE 7中,这种方式得以改进,现在你可以使用如下语句进行声明并赋值:

    Map<String, String> myMap = new HashMap<>(); //注意后面的"<>" 

      在这条语句中,编译器会根据变量声明时的泛型类型自动推断出实例化HashMap时的泛型类型。 
      再次提醒一定要注意new HashMap后面的“<>”,只有加上这个“<>”才表示是自动类型推断,否则就是非泛型类型的HashMap,并且在使用编译器编译源代码时会给出一个警告提示。 
      但是:Java SE 7在创建泛型实例时的类型推断是有限制的;只有构造器的参数化类型在上下文中被显著的声明了,才可以使用类型推断,否则不行。

      eg:下面的例子在java 7无法正确编译(但现在在java8里面可以编译,因为根据方法参数来自动推断泛型的类型):

    List<String> list = new ArrayList<>();   
    list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过   
    list.addAll(new ArrayList<>()); 

    4、Java8的泛型目标类型推断改进

      Java8里面泛型的目标类型推断主要有2个方面: 
      1)支持通过方法上下文推断泛型目标类型 
      2)支持在方法调用链路当中,泛型类型推断传递到最后一个方法 
      官网的例子:

    class List<E> {   
       static <Z> List<Z> nil() { ... };   
       static <Z> List<Z> cons(Z head, List<Z> tail) { ... };   
       E head() { ... }   
    }  

    在调用上面方法的时候可以这样写:

    //通过方法赋值的目标参数来自动推断泛型的类型   
    List<String> l = List.nil();   
    //而不是显示的指定类型   
    //List<String> l = List.<String>nil();   
    //通过前面方法参数类型推断泛型的类型   
    List.cons(42, List.nil());   
    //而不是显示的指定类型   
    //List.cons(42, List.<Integer>nil());  

    (注:以下内容是其他作者网上翻译的资料,中文原创找不到了,无法给出原创译文地址,觉得不错就转载过来了。英文官网地址:http://openjdk.java.net/jeps/101

  • 相关阅读:
    MySQL-EXPLAIN执行计划字段解释
    MySQL-EXPLAIN执行计划Extra解释
    HTTP与HTTPS的区别
    【面试】Java中sleep和wait的区别
    Nginx之前后端分离(入门)
    玩程序 之 一 . 字符串处理工具(可通过C#脚本扩展)
    C#实现下载功能,可用于软件自动更新
    对c#剪切板Clipboard占用的问题一点解决方法
    C# 制作 仪表
    C#使用自定义字体(从文件获取)
  • 原文地址:https://www.cnblogs.com/jasonZh/p/10615579.html
Copyright © 2020-2023  润新知