2013-08-17 20 views
84

コレクションインターフェイスでは、その実装を含むremoveIf()という名前のメソッドが見つかりました。インターフェイスで定義されたメソッドの「デフォルト」実装とは何ですか?

default boolean removeIf(Predicate<? super E> filter) { 
    Objects.requireNonNull(filter); 
    boolean removed = false; 
    final Iterator<E> each = iterator(); 
    while (each.hasNext()) { 
     if (filter.test(each.next())) { 
      each.remove(); 
      removed = true; 
     } 
    } 
    return removed; 
} 

インターフェイスにメソッド本体を定義する方法があるかどうかを知りたいですか?
defaultキーワードは何ですか、どのように機能しますか?

+3

デフォルトhttp://zeroturnaround.com/rebellabs/java-8-explained-default-methods/についてのこの記事を参照してください#!/ – emeraldjava

+0

関連記事https://stackoverflow.com/questions/31578427/what-is-the-purpose-of-the-default-keyword-in-java – Ravi

答えて

141

Java 8では、「デフォルトメソッド」または(Defenderメソッド)の新機能が導入されています。これにより、開発者はこれらのインターフェイスの既存の実装を破ることなく新しいメソッドをインターフェイスに追加できます。これは、具体的なクラスがそのメソッドの実装を提供できない状況で、デフォルトとして使用するインタフェース定義の実装を可能にする柔軟性を提供します。

public interface A { 
    default void foo(){ 
     System.out.println("Calling A.foo()"); 
    } 
} 

public class ClassAB implements A { 
} 

一つの共通の問題は、彼らが最初に新機能について聞くと、人々は、デフォルトの方法を尋ねることがあります:クラス2つのインターフェイスを実装し、それらの両方のインターフェイスは、デフォルトを定義

場合はどうすれば同じシグネチャを持つメソッド?

public interface A { 
    default void foo(){ 
     System.out.println("Calling A.foo()"); 
    } 
} 

public interface B { 
    default void foo(){ 
     System.out.println("Calling B.foo()"); 
    } 
} 


public class ClassAB implements A, B { 

} 

このコードは次のような結果とコンパイルに失敗:Clazzに、私たちはして手動でそれを解決しなければならない、という修正するには

java: class Clazz inherits unrelated defaults for foo() from types A and B 

この状況を説明するため

例相反する方法を無効にする:

public class Clazz implements A, B { 
    public void foo(){} 
} 

しかし、私たち自身の実装ではなく、インタフェースAからメソッドfoo()のデフォルトの実装を呼びたい場合はどうでしょうか?

次のように)#fooの(を参照することが可能である:

public class Clazz implements A, B { 
    public void foo(){ 
     A.super.foo(); 
    } 
} 
+14

ありがとう、本当に良い展覧会。あなたは私に質問する機会が来る前にすべての質問に答えました。 –

+1

非常に良い説明。どうもありがとうございました。 – user2045474

+0

なぜ代わりにabstractを使用しないのですか? –

48

これらのメソッドはデフォルトメソッドと呼ばれます。 デフォルトの方法またはディフェンダー方法彼らは具体的なクラスが提供しない場合にデフォルトとして使用される実装を提供するために、インターフェイスメソッドを可能にするために使用されますnewly added features Javaで8

の一つでありますそのメソッドの実装。デフォルトのメソッドとのインタフェース、持っている場合

ので、:

Hello hello = new HelloImpl(); 
hello.sayHello(); // This will invoke the default method in interface 
:あなたは HelloImplのインスタンスを作成した場合

public class HelloImpl implements Hello { 

} 

public interface Hello { 
    default void sayHello() { 
     System.out.println("Hello"); 
    } 
} 

次のクラスを完全に有効です


役立つリンク:

+0

クラスがインターフェースを実装していてそれを実装する方法は?私がこれを使用しているJava7については、許可されていません。 –

+2

@AniketThakur。これはJava 8より前では許可されていません。この機能はJava 8でのみ追加されています。実装クラスに* default *メソッドの実装を与えるのを避けることができます。 –

+0

偉大な+1答え: –

17

私は研究のビットを行なったし、私は次のことを発見しました。お役に立てれば。

既存の問題

標準インタフェースのメソッドはabstractとして宣言されているとのインタフェースを実装するクラスで定義しなければなりません。これは、宣言されたすべてのメソッドを実装する責任をクラス実装者に負担します。もっと重要なのは、これは、「出版」の後にインタフェースを拡張することができないことを意味します。それ以外の場合、すべての実装者は、ソースとバイナリの互換性を失うことなく、実装を適合させる必要があります。これらの問題に対処するために、Java 8

に採用

溶液JDK 8の新機能の1つは、デフォルトの方法で既存のインターフェースを拡張する可能性があります。 デフォルトのメソッドは宣言されるだけでなく、インタフェースでも定義されます。

  1. 実装者が 実装するクラスのデフォルトのメソッドを実装しないことを選択することができ、注意すべき

    重要なポイント。

  2. 実装者はデフォルトの メソッドをオーバーライドすることができます。通常の非finalクラスメソッドは サブクラスでオーバーライドできます。
  3. 抽象クラスでは、デフォルトメソッド を抽象として宣言して、サブクラスにメソッドを再実装させることができます( は「再抽象化」と呼ばれることもあります)。
関連する問題