方块操作符 ( <> ) 在 Java 7 中就引入了,目的是为了使代码更可读。
但是呢,这个操作符一直不能在匿名内部类中使用
Java 9 修正了这个问题,就是可以在匿名内部类中使用方块操作符了,在匿名类大行其道的今天,这才叫优化了阅读体验...
我们来看看一段 Java 9 之前的代码

DiamondOperatorTester.java

[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class DiamondOperatorTester {
       public static void main(String[] args) {
          Handler<Integer> intHandler = new Handler<Integer>(1) {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          intHandler.handle();
          Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          intHandler1.handle();
          Handler<?> handler = new Handler<Object>("test") {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          handler.handle();   
       
    }
    abstract class Handler<T> {
       public T content;
 
       public Handler(T content) {
          this.content = content;
       }
 
       abstract void handle();
    }

运行结果如下

[Java] 纯文本查看 复制代码
1
2
3
4
[[email]yufei@www.twle.cn[/email] java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
    1
    2
    test

不知道你是否看出来了,对于下面这两条语句

[Java] 纯文本查看 复制代码
1
2
3
Handler<? extends Number> intHandler1 = new Handler<Number>(2)
 
    Handler<?> handler = new Handler<Object>("test")
后面的匿名类中的那个 <Number> 和 Handler<Object> 中的尖括号的类型是可以推导出来的。
因为 Java 是强类型语言,所以,对于匿名内部类来说,赋值的变量类型其实就是内部类的变量类型
如果使用了推导,就可以改成下面这样
[Java] 纯文本查看 复制代码
1
2
3
Handler<? extends Number> intHandler1 = new Handler<>(2)
 
    Handler<?> handler = new Handler<>("test")
可读性是不是增强了,这样大家一眼就看出了匿名类的类型是它们赋值变量的类型
Java 9 也是这么做的,方块操作符 <> 的作用就是这个
因此,我们在 Java 9 以上的版本中,可以将范例改成下面这种方式
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class DiamondOperatorTester {
       public static void main(String[] args) {
          Handler<Integer> intHandler = new Handler<>(1) {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          intHandler.handle();
          Handler<? extends Number> intHandler1 = new Handler<>(2) {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          intHandler1.handle();
          Handler<?> handler = new Handler<>("test") {
             @Override
             public void handle() {
                System.out.println(content);
             }
          };
          handler.handle();   
       
    }
    abstract class Handler<T> {
       public T content;
 
       public Handler(T content) {
          this.content = content;
       }
 
       abstract void handle();
    }
运行结果也是一样的
[Java] 纯文本查看 复制代码
1
2
3
4
[[email]yufei@www.twle.cn[/email] java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
   1
   2
   test

Java 9 新特性 – 内部类的方块操作符的更多相关文章

  1. Java-Runoob-高级教程:Java 9 新特性

    ylbtech-Java-Runoob-高级教程:Java 9 新特性 1.返回顶部 1. Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变 ...

  2. Java 8新特性之旅:使用Stream API处理集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  3. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  4. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  5. Java 8新特性解读

    (四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...

  6. Java 8 新特性——实践篇

    Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...

  7. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  8. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  9. java 8 新特性

    最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...

随机推荐

  1. SQL游标的介绍与使用举例

    一.游标的定义 declare (游标名) [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR{READ ONLY|UPDATE[OF co ...

  2. 程序Dog的大梦想

    一.我是程序狗 "怎么又是任宏啊,每天都起这么早,要命啊--" "人家任宏可是要成为学霸的男人,咱们这些凡夫俗子啊,理解不了这么伟大的理想--"----微电影& ...

  3. sqlserver2008的sql语句支持的最大长度

    想写一个sql语句,很长,主要是in后跟着无数个用户ID,(虽然实现方式很低级,但是还是凑合着用吧) 不知道sql最大长度是多少,看了 SQL Server 的最大容量规范,写的是 包含 SQL 语句 ...

  4. Python KNN 学习曲线

    学习曲线的目的是选择更好的模型参数.以最近邻算法为例,选取最近的多少个数据点,才能达到最优.可以控制训练集不动,调整最近的点的个数,绘制学习曲线. import matplotlib.pyplot a ...

  5. polyA|ribo-minus|differentiated cell|Genetic heterogeneity

    转录组 测量单cell,可以认为是一种细胞.细胞株也认为来自同一个细胞. 使用两种方法,找mRNA(polyA)及rmRNA(ribo-minus),然后取交集. 转录组受实验影响,比如小片段没得到. ...

  6. Python—插入排序算法

    # 插入排序,时间复杂度O(n²) def insert_sort(arr): """ 插入排序:以朴克牌为例,从小到大排序.摸到的牌current与手里的每张牌进行对比 ...

  7. Collection接口介绍

    Collection接口介绍 一个Collection代表一组对象,是集合体系中的根接口.一些允许有重复的元素一些不允许,一些有顺序一些没有顺序.JDK不提供此接口具体类的直接实现,只会有子接口和抽象 ...

  8. 天融信(NAT)地址转换端口映射配置

    目的地址为公司的公网地址 服务:选择或者自己定义一个端口号,就是要映射到服务器上的那个端口号 目的地址转换为:服务器ip 目的端口转换为:选择定义的服务(端口号) 规则描述:随便写

  9. mybatis 自定义类型转换器 (后台日期类型插入数据库)

    后台日期类型插入数据库 有以下几种发法: 1 调用数据库 日期字符串转日期函数 str_to_date("日期","yyyy-MM-dd HH:mm:ss") ...

  10. matlab2016b

    http://www.cnblogs.com/CQBZOIer-zyy/p/5933954.html