Java9钻石运算符匿名内层类示例

128 阅读1分钟

Java9 features - diamond operator anonymous inner class examples

在这篇博文中,通过一个例子介绍_Java9的功能钻石运算符的改进,允许匿名的内层类。

让我们看看钻石运算符在java7,8,9版本中是如何声明的。

java7钻石运算符示例

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


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

Left side 是使用数据类型为String的Generics,Right side ,等价运算符是原始类型,即ArrayList,它是从左侧类型推断出来的。我们可以将钻石运算符应用于可识别类型的推断类型。可识别类型是Integer, Strings,可以应用泛型在java中使用。

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

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

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

我们将看到如何通过实现这个抽象类来创建一个实例。
使用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的钻石运算符程序示例

Diamond operators 也可以用于内层类。

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

java 钻石运算符匿名内层类示例

Anonyms内部类与钻石运算符一起使用

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

输出

one  
two 

由于在java8中引入了Lambda表达式,所以Anonyms的使用并不多,但它们提高了代码的可读性,如果需要的话可以使用。