方块操作符 ( <> ) 在 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