2016-04-10 9 views
1

SubclassOneClassOne erweitert und implementiert InterfaceOne, die beide eine void doSomething(){} Methode hat. der Compiler Fehlermeldung anzeigen, wardoSomething() in ClassOne nicht doSomething() in InterfaceOne, Versuch implementieren schwächeren Zugriffsrechte zuweisen, war öffentlich

doSomething() in ClassOne kann jedoch nicht doSomething() in InterfaceOne, Versuch implementieren schwächeren Zugriffsrechte zuweisen, öffentliche

Könnte mir bitte jemand sagen Warum zeigt der Compiler diese bestimmte Nachricht an? Was ist der Grund dafür?

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

Methoden in Schnittstellen sind implizit' public'. – Savior

+2

Ich denke, die Frage ist, dass classone Interfaceone nicht implementiert, aber immer noch einen Fehler bekommen. Es ist kein Duplikat davon –

+1

@TamasHegedus Der Fehler ist nicht in 'ClassOne'. Die Nachricht bezieht sich einfach auf 'ClassOne', weil 'SubclassOne' versucht, sie zu überschreiben. Der Fehler liegt in 'SubclassOne', um' doSomething' als Paket privat zu erben und es als 'public' für' InterfaceOne' zu ​​implementieren. Dies ist ein exaktes Duplikat. – Savior

Antwort

0

Methoden in Schnittstellen sind public. Methoden ohne Zugriffsmodifizierer package-private, d.h. schwächere Zugriffsberechtigung. Hinzufügen public Modifikator doSomething in ClassOne

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

können Sie sehen die Zugriffsmodifikatoren Tabelle am documentation

+0

Sie haben genug Ruf. Bitte stimmen Sie einfach für das Duplikat ab. – Savior

+2

@Pillar Ich denke nicht, dass es ein Duplikat ist. Zumindest nicht, was du als Duplikat markiert hast. – Guy

+1

Warum nicht? Sie fragen nach dem gleichen Ding. Die meisten [upvoted antwort] (http://stackoverflow.com/a/13160716/5191913) sagt genau die gleichen Dinge wie Sie. – Savior

2

In dieser Situation Ihre SubclassOne gehen werden eine Implementierung zur Verfügung zu stellen, die sowohl übergeordnete Klasse erfüllt, und Schnittstelle. Da es einen Konflikt mit Zugriffsmodifizierern von zwei Methoden gibt, erhalten Sie eine solche Fehlermeldung.

(Ihr ClassOne ‚s Zugriffsmodifikator ist nicht public. Es ist Paket sichtbar.)