2016-04-04 19 views
3

Die Schnittstelle hat calculate abstrakte Methode und ramdom() nicht abstrakte Methode. Ich möchte superramdom() und auch Overrideramdom() bei Beton Klasse CalculatorImpl verwenden. Meine Frage ist warum muss ich so anrufen Calculator.super.ramdom()? Warum funktionieren super.ramdon() nicht?Rufen Sie die nicht abstrakte Methode der Superschnittstelle in der konkreten Klasse auf

public interface Calculator { 

    double calculate(int a); 

    default double ramdom() { 
     System.out.println("Calculator ramdom"); 
     return Math.random(); 
    } 

} 

class CalculatorImpl implements Calculator { 

    @Override 
    public double calculate(int a) { 
     // calling super.ramdom() will get [The method ramdom() is undefined for 
     // the type Object error] 
     return Calculator.super.ramdom() * a; 
    } 

    @Override 
    public double ramdom() { 
     System.out.println("CalculatorImpl ramdom"); 
     return 0; 
    } 

} 
+1

Mögliche Duplikate von [Wie zu buchstabieren zufällig] ( – shmosel

Antwort

2

zur Verfügung gestellt wird Um Ihre genaue Frage zu beantworten: Wenn Sie innerhalb einer Klasse Super ... Sie "zeigen" auf die Klasse es erweitert; in diesem Fall Objekt.

Aber Objekt hat keine zufällige Methode, die Sie aufrufen könnten.

Deshalb müssen Sie es explizit machen "wo" zufällig kommt eigentlich aus.

0

Entfernen Sie einfach die Überschreibung von ramdom in CalculatorImpl. Es wird implizit die default Implementierung von verwendet.

class CalculatorImpl implements Calculator { 

@Override 
public double calculate(int a) { 
    // calling super.ramdom() will get [The method ramdom() is undefined for 
    // the type Object error] 
    return Calculator.super.ramdom() * a; 
} 
/* Remove the Override and the default implementation will be used 
@Override 
public double ramdom() { 
    System.out.println("CalculatorImpl ramdom"); 
    return 0; 
} 
*/ 
} 

Stichwort super wird verwendet, um rufen Sie die vererbten Klasse und nicht die implementierte Schnittstelle. Aber hier haben Sie kein Erbe außer den impliziten Object, die keine random Methode

bearbeiten hat: Ich habe missunderstood Ihre Frage. Wenn Sie die Standardimplementierung überschreiben und aufrufen möchten, überprüfen Sie die link, die von Sasha Salauyou

+0

) in der Tat, entfernen "@ Override" wird nichts auswirken. Es ist nur eine Anmerkung, die dem Compiler sagt, dass du irgendeine Methode überschreiben wirst (damit er die Signatur überprüfen und sagen kann, ob du dich irrst) –

+0

@Sasha Salauyou Ich spreche sicherlich nicht über die Annotation, sondern über die ganze Methode, wie das Codebeispiel zeigt;) – ortis

+1

ich sehe, aber es hat auch keinen Sinn. OP sagt, sie müssen auch überschrieben werden. –