Java 9中的"菱形"语法详解

 更新时间:2023年06月07日 15:46:04   作者:java中文网  
Java 9 再次增强了“菱形”语法,它甚至允许在创建匿名内部类时使用菱形语法,Java 可根据上下文来推断匿名内部类中泛型的类型,下面程序示范了在匿名内部类中使用菱形语法,感兴趣的朋友跟随小编一起看看吧

在 Java 7 版本以前,如果使用带泛型的接口、类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,这显得有些多余了。例如如下两条语句:

List<String> strList = new ArrayList<String>();
Map<String, Integer> scores = new HashMap<String, Integer>();

从 Java 7 开始,Java 允许在构造器后不带完整的泛型信息,只要给出一对尖括号<>即可。Java 可以推断出尖括号里应该是什么泛型信息。

即上面两条语句可以改写为如下形式:

List<String> strList = new ArrayList<>();
Map<String, Integer> scores = new HashMap<>();

把两个尖括号并排放在一起非常像一个菱形,这种语法也就被称为“菱形”语法。下面程序示范了 Java 7 的菱形语法。

public class Test {
    public static void main(String[] args) {
        // Java自动推断出ArrayList的<>里应该是String
        List<String> names = new ArrayList<>();
        names.add("JAVA中文网Java入门教程");
        names.add("JAVA中文网Spring入门教程");
        // 遍历names集合,集合元素就是String类型
        names.forEach(ele -> System.out.println(ele.length()));
        // Java 自动推断出 HashMap 的<>里应该是 String,List<String>
        Map<String, List<String>> coursesInfo = new HashMap<>();
        // Java自动推断出ArrayList的<>里应该是String
        List<String> courses = new ArrayList<>();
        courses.add("Java入门教程");
        courses.add("Python基础教程");
        coursesInfo.put("JAVA", courses);
        // 遍历 Map 时,Map 的 key 是 String 类型,value List<String>类型
        coursesInfo.forEach((key, value) -> System.out.println(key + "-->" + value));
    }
}

上面程序中代码第 4、10 和 12 行代码就是“菱形”语法的示例。从该程序不难看出,“菱形”语法对原有的泛型并没有改变,只是更好地简化了泛型编程。

Java 9 再次增强了“菱形”语法,它甚至允许在创建匿名内部类时使用菱形语法,Java 可根据上下文来推断匿名内部类中泛型的类型。下面程序示范了在匿名内部类中使用菱形语法。

首先定义一个接口:

interface Foo<T> {
    void test(T t);
}

创建实现类:

public class AnnoymousTest {
    public static void main(String[] args) {
        // 指定Foo类中泛型为String
        Foo<String> f = new Foo<>() {
            // test()方法的参数类型为String
            public void test(String t) {
                System.out.println("test 方法的 t 参数为:" + t);
            }
        };
        // 使用泛型通配符,此时相当于通配符的上限为Object
        Foo<?> fo = new Foo<>() {
            // test()方法的参数类型为Object
            public void test(Object t) {
                System.out.println("test 方法的 Object 参数为:" + t);
            }
        };
        // 使用泛型通配符,通配符的上限为Number
        Foo<? extends Number> fn = new Foo<>() {
            // 此时test ()方法的参数类型为Number
            public void test(Number t) {
                System.out.println("test 方法的 Number 参数为:" + t);
            }
        };
    }
}

上面程序先定义了一个带泛型声明的接口,接下来第 4、11 和 18 行代码分别示范了在匿名内部类中使用菱形语法。第 4行代码声明变量时明确地将泛型指定为 String 类型,因此在该匿名内部类中 T 类型就代表了 String 类型;第 11 行代码声明变量时使用通配符来代表泛型(相当于通配符的上限为 Object),因此系统只能推断出 T 代表 Object,所以在该匿名内部类中 T 类型就代表了 Object 类型;第 18 行代码声明变量时使用了带上限(上限是 Number)的通配符,因此系统可以推断出 T 代表 Number 类。

无论以上哪种方式,Java 9 都允许在使用匿名内部类时使用菱形语法。

到此这篇关于Java 9中的“菱形”语法的文章就介绍到这了,更多相关Java 9菱形语法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea 查看一个类的所有子类以及子类的子类并以层级关系显示

    idea 查看一个类的所有子类以及子类的子类并以层级关系显示

    这篇文章主要介绍了idea 查看一个类的所有子类以及子类的子类并以层级关系显示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java多线程之中断线程(Interrupt)的使用详解

    Java多线程之中断线程(Interrupt)的使用详解

    interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程
    2013-05-05
  • SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(后端)

    SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(后端)

    这篇文章主要介绍了SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(后端),快速生成后端代码、封装结果集、增删改查、模糊查找,毕设基础框架,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • IntelliJ IDEA各种图标的含义

    IntelliJ IDEA各种图标的含义

    这篇文章主要介绍了IntelliJ IDEA各种图标的含义,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java基础学习之方法的重载知识总结

    Java基础学习之方法的重载知识总结

    今天带大家来回顾Java基础知识,文中对Java方法的重载相关知识作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • java string的一些细节剖析

    java string的一些细节剖析

    首先说明这里指的是Java中String的一些细节部分,需要的朋友可以参考
    2012-11-11
  • Java锁机制Lock用法示例

    Java锁机制Lock用法示例

    这篇文章主要介绍了Java锁机制Lock用法,结合具体实例形式分析了Java锁机制的相关上锁、释放锁、隐式锁、显式锁等概念与使用技巧,需要的朋友可以参考下
    2018-08-08
  • Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案

    Spring应用抛出NoUniqueBeanDefinitionException异常的解决方案

    这篇文章介绍了解决org.springframework.beans.factory.NoUniqueBeanDefinitionException异常的一些解决方案,从这些解决方案可以看出Spring框架的设计精妙,遇见此问题的朋友可以参考下该解决方案
    2021-06-06
  • 鉴权认证+aop+注解+过滤feign请求的实例

    鉴权认证+aop+注解+过滤feign请求的实例

    这篇文章主要介绍了鉴权认证+aop+注解+过滤feign请求的实例讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 关于@Autowired注入依赖失败的问题及解决

    关于@Autowired注入依赖失败的问题及解决

    这篇文章主要介绍了关于@Autowired注入依赖失败的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论