utilizzo di interface.super.print () in java8

1

In java8, stiamo usando interface.super.

Considerando i seguenti punti

  1. Ci sono 2 interfacce ma nessuna delle interfacce eredita da un'altra.
  2. Esiste una classe di implementazione che eredita entrambe le 2 interfacce.
  3. Ogni interfaccia ha un metodo predefinito ma il nome è lo stesso per entrambi i metodi.

Ora, in questo scenario, nella classe di implementazione è costringendomi a sovrascrivere il metodo print () predefinito. E nel corpo ho bisogno di usare entrambi

Interface_one.super.print();
o
Interface_two.super.print();

Sono nuovo di Java8, mi piacerebbe capire gli strani comportamenti dell'uso dell'interfaccia.super. Anche l'implementazione del metodo print () che forza le dichiarazioni Interface_one.super.print(); o Interface_two.super.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();
    }
}
    
posta santu 27.10.2015 - 18:01
fonte

3 risposte

5

Se si eredita da due interfacce A e B, quindi A.super.foo() chiama il metodo foo (predefinito) dell'interfaccia A.

Quando implementi due interfacce con metodi predefiniti con lo stesso nome, è ambigua. Devi risolvere questa ambiguità affermando esplicitamente quale dei due metodi predefiniti desideri utilizzare per l'implementazione. Lo fai sovrascrivendo il metodo in questione e chiamando direttamente l'implementazione dell'interfaccia "genitore". Lo fai con la nuova sintassi: ParentInterfaceName.super.methodName();

    
risposta data 27.10.2015 - 18:24
fonte
1

Un'altra cosa: non c'è ambiguità quando il metodo sovrascrittura come risposta accettata sta dicendo che devi usare A.super o B.super solo se vuoi riutilizzare l'implementazione predefinita, quindi indicare quale print () si desidera utilizzare in quanto sono due. Puoi omettere di chiamare qualsiasi metodo predefinito e scrivere un'implementazione completamente nuova o persino rendere quel metodo (e la classe) astratto.

    
risposta data 18.11.2015 - 10:45
fonte
0

Java 8, che consente alle interfacce di avere un'implementazione predefinita, questa funzionalità era stata data come privilegio per coloro che utilizzavano la classe astratta e desidera sostituirli con CODE TO INTERFACE,

La classe meno concreta è costretta ad avere una propria implementazione in caso di qualsiasi ambiguità. Se non c'è ambiguità, semplicemente usa il comportamento dei suoi genitori e non costringe a implementare.

Usando lo stesso nome del metodo qui abbiamo creato l'ambiguità.

puoi optare per qualsiasi implementazione come di seguito.

@Override
    public void  print(){}

Se implementiamo hierarchical dependency.it funzionerà.

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();
    }
}
    
risposta data 26.02.2016 - 15:15
fonte

Leggi altre domande sui tag