2023-03-19  阅读(2)
原文作者:简单教程 原文地址: https://www.twle.cn/c/yufei/java9/java9-basic-intro.html

方块操作符 ( <> ) 在 Java 7 中就引入了,目的是为了使代码更可读。

但是呢,这个操作符一直不能在匿名内部类中使用

Java 9 修正了这个问题,就是可以在匿名内部类中使用方块操作符了,在匿名类大行其道的今天,这才叫优化了阅读体验...

我们来看看一段 Java 9 之前的代码

DiamondOperatorTester.java

    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();
    }

运行结果如下

    [yufei@www.twle.cn java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
    1
    2
    test

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

    Handler<? extends Number> intHandler1 = new Handler<Number>(2)
    
    Handler<?> handler = new Handler<Object>("test")

后面的匿名类中的那个 <Number>Handler<Object> 中的尖括号的类型是可以推导出来的。

因为 Java 是强类型语言,所以,对于匿名内部类来说,赋值的变量类型其实就是内部类的变量类型

如果使用了推导,就可以改成下面这样

    Handler<? extends Number> intHandler1 = new Handler<>(2)
    
    Handler<?> handler = new Handler<>("test")

可读性是不是增强了,这样大家一眼就看出了匿名类的类型是它们赋值变量的类型

Java 9 也是这么做的,方块操作符 <> 的作用就是这个

因此,我们在 Java 9 以上的版本中,可以将范例改成下面这种方式

    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();
    }

运行结果也是一样的

    [yufei@www.twle.cn java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
    1
    2
    test

Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文