| 
            方块操作符 ( <> ) 在 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
                   |  
                   
                    publicclassDiamondOperatorTester { 
                           publicstaticvoidmain(String[] args) { 
                              Handler<Integer> intHandler = newHandler<Integer>(1) { 
                                 @Override 
                                 publicvoidhandle() { 
                                    System.out.println(content); 
                                 } 
                              }; 
                              intHandler.handle(); 
                              Handler<? extendsNumber> intHandler1 = newHandler<Number>(2) { 
                                 @Override 
                                 publicvoidhandle() { 
                                    System.out.println(content); 
                                 } 
                              }; 
                              intHandler1.handle(); 
                              Handler<?> handler = newHandler<Object>("test") { 
                                 @Override 
                                 publicvoidhandle() { 
                                    System.out.println(content); 
                                 } 
                              }; 
                              handler.handle();     
                           }   
                        } 
                        abstractclassHandler<T> { 
                           publicT content; 
                     
                    
                           publicHandler(T content) { 
                              this.content = content;  
                           } 
                     
                    
                           abstractvoidhandle(); 
                        } | 
 运行结果如下
  
            
             [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<? extendsNumber> intHandler1 = newHandler<Number>(2) 
                     
                    
                        Handler<?> handler = newHandler<Object>("test") | 
 
            后面的匿名类中的那个 <Number> 和 Handler<Object> 中的尖括号的类型是可以推导出来的。
            
            因为 Java 是强类型语言,所以,对于匿名内部类来说,赋值的变量类型其实就是内部类的变量类型
            
            如果使用了推导,就可以改成下面这样
             
             
             
              [Java] 
              纯文本查看 
              复制代码
               
               
                
               | 
                    1
                    
                    2
                    
                    3
                    |  
                    
                     Handler<? extendsNumber> intHandler1 = newHandler<>(2) 
                      
                     
                         Handler<?> handler = newHandler<>("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
                    |  
                    
                     publicclassDiamondOperatorTester { 
                            publicstaticvoidmain(String[] args) { 
                               Handler<Integer> intHandler = newHandler<>(1) { 
                                  @Override 
                                  publicvoidhandle() { 
                                     System.out.println(content); 
                                  } 
                               }; 
                               intHandler.handle(); 
                               Handler<? extendsNumber> intHandler1 = newHandler<>(2) { 
                                  @Override 
                                  publicvoidhandle() { 
                                     System.out.println(content); 
                                  } 
                               }; 
                               intHandler1.handle(); 
                               Handler<?> handler = newHandler<>("test") { 
                                  @Override 
                                  publicvoidhandle() { 
                                     System.out.println(content); 
                                  } 
                               }; 
                               handler.handle();     
                            }   
                         } 
                         abstractclassHandler<T> { 
                            publicT content; 
                      
                     
                            publicHandler(T content) { 
                               this.content = content;  
                            } 
                      
                     
                            abstractvoidhandle(); 
                         } | 
 
            运行结果也是一样的
             
             
             
              [Java] 
              纯文本查看 
              复制代码
               
               
                
               | 
                    1
                    
                    2
                    
                    3
                    
                    4
                    |  
                    
                     [[email]yufei@www.twle.cn[/email] java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester 
                        1 
                        2 
                        test | 
 |