Java9钻石运算符匿名内类的改进与实例

121 阅读1分钟

在这篇博文中,我们将通过一个例子介绍Java9的特点--允许匿名内类的钻石运算符改进。

java7钻石运算符示例

我们可以按如下方式声明钻石运算符

  
List listjava6 = new ArrayList();  //  Before java7 ie Java6 or less  
List listjava7 = new ArrayList<>();   //  with java7  

左边使用的是数据类型为String的Generics,右边的等价运算符是原始类型ArrayList,它是从左边的类型推断出来的。我们可以将钻石运算符应用于推断出的可表示类型的类型。DenotablJavapes是Integer, Strings,可以应用泛型来在java中使用。

例如,创建了一个抽象的Message类,如下所示

abstract class Message {  
 public T text;  
 public Message(T text) {  
  this.text = text;  
 }  
 abstract void getMessage();  
} 

Java8钻石运算符匿名内部类例子

在java8中,我们可以为上述抽象实现编写如下代码

Message stringMessage = new Message("one") {  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  
  stringMessage.getMessage(); 

这是有效的代码,没有使用钻石运算符。如何用钻石运算符写代码,见下图

Message stringMessage1 = new Message<>("one"){  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  
or     
  Message stringMessage1 = new Message<>("one") {  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  }; 

这段代码很简单,可读性很强。但是这段代码出现了**编译错误'<>'不能与匿名类一起使用_**在java8或之前,编译器对_钻石运算符的匿名内部类抛出错误。Java9允许对内部类使用匿名的钻石操作符

Java9钻石运算符程序示例

钻石运算符也可以用于内层类

Message stringMessage1 = new Message<>("one") {  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  
or   
  Message stringMessage1 = new Message<>("one"){  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  

钻石运算符匿名内类程序示例

public class Summary {  
 public static void main(String[] args) {  
  Message stringMessage = new Message("one") {  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  
  stringMessage.getMessage();  
  Message stringMessage1 = new Message<>("two") {  
   @Override  
   public void getMessage() {  
    System.out.println(text);  
   }  
  };  
  stringMessage1.getMessage();  
 }  
}  
abstract class Message {  
 public T text;  
  
 public Message(T text) {  
  this.text = text;  
 }  
 abstract void getMessage();  
} 

因为在java8中引入了Lambda表达式,所以匿名的作用不大,但是他们提高了代码的可读性,如果需要,可以使用。