網頁

2017/9/20

Java Interface的Default Methods

Java 8導入了Default Methods(預設方法)的特性,其為interface的實作方法。

在Java 8以前定義在介面的方法都不可有實作(但可以有靜態方法static method的實作),介面的方法實作必須透過類別來覆寫(override),一旦介面增加新的方法其實作類別也必須增加該方法的實作,否則無法通過編譯。

例如類別ClassA實作介面InterfaceA,有一個sayHello()方法。

public interface InterfaceA {
  
  public void sayHello();

}

類別ClassA實作InterfaceA介面

public class ClassA implements InterfaceA{

  @Override
  public void sayHello() {
    System.out.println("hello");
  }
}

如果InterfaceA增加了一個方法sayHi(),則ClassA必須實作sayHi(),否則無法通過編譯。


Java 8加入了default methods後,提高了Java向後相容的能力,使得在舊介面添加新的方法變得容易。例如CollectionList繼承的Iterable介面原本沒有forEach()方法,Java 8為了增加Lambda語法的可用性,所以加入了forEach()方法。如果沒有default methods,則實作此介面的類別將都必須實作forEach()方法,使得在擴展舊介面變得相對困難。

承上面的例子,如果在InterfaceA的新方法的存取修飾子前加入default,則此方法即為default methods。

default methods的實作是寫在介面的方法中,因此實作類別不實作default methods仍可正常編譯。


如果類別同時繼承兩個介面,而兩個介面都擁有同樣名稱的default methods,類別就一定要覆寫該方法了,因為會出現Duplicate default methods的錯誤。


沒有留言:

張貼留言