2016-04-04 8 views
3

Calculatorインターフェイスは、calculate抽象メソッドとramdom()抽象メソッドを持っています。私はスーパーramdom()ramdom()を具象クラスCalculatorImplで上書きしたいと思います。私の質問は、なぜそれをCalculator.super.ramdom()のように呼び出さなければならないのですか?なぜsuper.ramdon()が機能しないのですか?コンクリートクラスの非抽象メソッドを呼び出す

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

実際には、 '@ Override'を削除しても何も影響しません。[How to spell random](http://www.spellweb.com/how-do-you-spell/random) – shmosel

答えて

2

正確な質問に答えるには:クラス内でsuperを使用する場合...拡張しているクラスを指しています。この場合はObjectです。

しかし、オブジェクトは、あなたが呼び出すことができることを、ランダムな方法を持っていません。

したがって、あなたが「ここで」ランダムが実際にから来ていることが明示的に確認する必要があります。

0

だけCalculatorImplramdomのオーバーライドを削除します。暗黙的にdefaultの実装をCalculatorから使用します。

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; 
} 
*/ 
} 

キーワードsuper継承クラスなく実装されたインタフェースを呼び出すために使用されています。しかし、ここでは、編集random方法に

を持っていない暗黙のObject以外には継承を持っていない:私はあなたの質問をmissunderstoodている場合があります。デフォルトの実装をオーバーライドして呼び出したい場合は、linkがSasha Salauyouによって提供されていることを確認してください。

+0

それはあなたには、いくつかのメソッドをオーバーライドするつもりだ(それが署名をチェックし、あなたが間違っている場合は言うことができる)私は確かにコードサンプルとして、注釈が、方法全体の話ではないのです –

+0

@Sasha Salauyouをちょうど注釈伝えるコンパイラですショー;) – ortis

+1

私は参照してください、しかしそれはまた意味がありません。 OPは、オーバーライドされたメソッドも必要としていると言います。 –

関連する問題