web-dev-qa-db-ja.com

Java8でのinterface.super.print()の使用

Java8では、interface.superを使用しています。

以下の点を考慮

  1. 2つのインターフェースがありますが、どのインターフェースも別のインターフェースを継承していません。
  2. これら2つのインターフェースの両方を継承している実装クラスがあります。
  3. 各インターフェースにはデフォルトのメソッドがありますが、名前は両方のメソッドで同じです。

このシナリオでは、実装クラスで、デフォルトのprint()メソッドをオーバーライドする必要があります。そして体の中で私はどちらかを使う必要があります

Interface_one.super.print();
または
Interface_two.super.print();

私はJava8を初めて使用しますが、interface.superを使用した場合の奇妙な動作を理解したいと思います。また、ステートメントInterface_one.super.print();またはInterface_two.super.print();を強制するprint()メソッドの実装

 public interface Interface_one {
    public void method1();

    default void print(){
        System.out.println("this is default print in first interface");
    }
}


public interface Interface_two {
public void method2();

    default void print(){
        System.out.println("this is default print in second interface");
    }
}

public class ImplementedClass implements Interface_one, Interface_two{

    @Override
    public void method1() {
        System.out.println("Implemented Method 1");

    }

    @Override
    public void method2() {
        print();
        System.out.println("Implemented Method 2");
    }

    @Override
    public void print() {
        Interface_one.super.print();
    }

    public static void main(String[] args) {
        new ImplementedClass().method2();
    }
}
1
santu

2つのインターフェースAとBから継承する場合、A.super.foo()はAインターフェースのfoo(デフォルト)メソッドを呼び出します。

それぞれが同じ名前のデフォルトメソッドを持つ2つのインターフェイスを実装すると、あいまいになります。実装で使用する2つのデフォルトのメソッドのどちらを明示的に指定することにより、そのあいまいさを解決する必要があります。これを行うには、問題のメソッドをオーバーライドし、「親」インターフェースの実装を直接呼び出します。これは、新しい構文ParentInterfaceName.super.methodName();で行います。

5
MrDrews

もう1つ:受け入れられた答えが言っているようにオーバーライドメソッドが言っているときはあいまいさはありませんしたいデフォルトの実装を再利用する場合にのみA.superまたはB.superを使用する必要があります、次に、2つあるのでどのprint()を使用するかを指定します。デフォルトのメソッドの呼び出しを省略して、まったく新しい実装を記述したり、そのメソッド(およびクラス)を抽象化することもできます。

1
molok

Java 8は、インターフェースにデフォルトの実装を許可します。この機能は、抽象クラスを使用していて、それらをCODE TOINTERFACEに置き換えたい人のための特権として与えられていました。

最も具体的でないクラスは、あいまいな場合に備えて独自の実装を強制されます。あいまいさがない場合は、親の動作を使用するだけで、実装を強制しません。

ここで同じメソッド名を使用することにより、あいまいさが生じました。

以下のような実装を選択できます。

@Override
    public void  print(){}

階層的な依存関係を実装すると、機能します。

interface Interface_one {
    default void print() {
        System.out.println("this is default print in first interface");
    }
}

interface Interface_two extends Interface_one {
    default void print() {
        System.out.println("this is default print in second interface");
    }
}

public class MultipleInterfaces implements Interface_one, Interface_two {
    public static void main(String[] args) {
        MultipleInterfaces multipleInterfaces = new MultipleInterfaces();
        Interface_one one = new MultipleInterfaces();
        Interface_two two = new MultipleInterfaces();
        multipleInterfaces.print();
        one.print();
        two.print();
    }
}
0
Kumar Abhishek