2016-04-10 7 views
1

SubclassOneパブリックたvoid doSomething(){}方法を有する両方とも、ClassOneを拡張し、InterfaceOneを実現します。しかし、コンパイラの表示エラーメッセージ、のdoSomething()は、InterfaceOneに弱いアクセス権を割り当てる試みのdoSomething()を実装することができない、

doSomethingの()はClassOneにdoSomethingのを(実装することはできません) にInterfaceOne、弱いアクセス権を割り当てるための試みは、

公衆た誰かが私に教えてもらえますなぜコンパイラがこの特定のメッセージを表示するのですか?その背後にある理由は何ですか?

public class ClassOne { 
    void doSomething(){ 
     System.out.println("do something from InterfaceMethod class"); 
    } 
} 


public interface InterfaceOne { 
    default void doSomething(){ 
     System.out.println("do something from InterfaceOne"); 
    } 
} 


public class SubclassOne extends ClassOne implements InterfaceOne{ 
    public static void main(String[] args) { 

    } 
} 
+2

メソッドは暗黙のうちに 'public'です。 – Savior

+2

私は、classoneがinterfaceoneを実装していないのですが、まだエラーが出ていると思います。 –

+1

@TamasHegedusエラーは 'ClassOne'にありません。 'SubclassOne'がそれを上書きしようとしているので、メッセージは単に' ClassOne'を参照します。このエラーは 'SubclassOne'にあり、' doSomething'をパッケージプライベートとして継承し、 'InterfaceOne'に対して' public'として実装しようとしています。これは正確な複製です。 – Savior

答えて

0

インターフェイス内のメソッドは、publicです。アクセス修飾子なしのメソッドpackage-private、すなわち弱いアクセス権。あなたはSubclassOneがスーパークラス、およびインタフェースの両方を満たす実装を提供しようとするでしょう、あなたのこのような状況ではdocumentation

+0

あなたは評判が十分です。重複して投票してください。 – Savior

+2

@Pillar私はそれが重複しているとは思わない。少なくともあなたが重複としてマークしたものではありません。 – Guy

+1

なぜですか?彼らは同じことを求めている。ほとんどの[upvoted答え](http://stackoverflow.com/a/13160716/5191913)はあなたとまったく同じものを述べています。 – Savior

2

でアクセス修飾子テーブルを参照することができClassOne

public class ClassOne { 
    public void doSomething(){ 
     System.out.println("do something from InterfaceMethod class"); 
    } 
} 

doSomethingからpublic修飾子を追加します。したがって、2つのメソッドのアクセス修飾子と競合するので、そのようなエラーメッセージが表示されます。

(あなたClassOneのアクセス修飾子がpublicではありません。それはパッケージ見えます。)インタフェースで

関連する問題