Kan een interfacemethode een body hebben?

Ik weet dat een interface een 100% pure abstracte klasse is. Het kan dus geen methode-implementatie bevatten. Maar ik zag een vreemde code. Kan iemand het uitleggen?

Codefragment:

interface Whoa {
        public static void doStuff() {
            System.out.println("This is not default implementation");
        }
 }

BEWERKEN:

Mijn IDE is Intellij Idea 13.1. De project-SDK is java 7 <1.7.0_25>. De IDE geeft geen compilerfout weer. Maar wanneer ik de code compileer op de opdrachtregel, krijg ik het volgende bericht.

Whoa.java:2: error: modifier static not allowed here
    public static void doStuff() {
                       ^

Antwoord 1, autoriteit 100%

Vanaf Java 8kunt u naast standaardmethoden ook statische methoden in interfaces definiëren.

  • Een statische methode is een methode die is gekoppeld aan de klasse waarin deze is gedefinieerd in plaats van aan een willekeurig object. Elke instantie van de klasse deelt zijn statische methoden.

  • Dit maakt het gemakkelijker voor u om hulpmethoden in uw bibliotheken te organiseren; je kunt statische methoden die specifiek zijn voor een interface in dezelfde interface houden in plaats van in een aparte klasse.

  • Het volgende voorbeeld definieert een statische methode die een ZoneId-object ophaalt dat overeenkomt met een tijdzone-ID; het gebruikt de standaardtijdzone van het systeem als er geen ZoneId-object is dat overeenkomt met de gegeven identifier. (Hierdoor kunt u de methode getZonedDateTimevereenvoudigen)

Hier is de code:

public interface TimeClient {
   // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +"; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }
   default public ZonedDateTime getZonedDateTime(String zoneString) {
      return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
   }    
}

Zie ook


Antwoord 2, autoriteit 18%

Dit is alleen mogelijk in Java 8. In de Java 7taalspecificatie §9.4, staat expliciet vermeld:

Het is een compile-time-fout als een methode die in een interface is gedeclareerd, statisch wordt verklaard, omdat statische methoden niet abstract kunnen zijn.

Dus in Java 7 kunnen statische methoden in interfaces nietbestaan.

Als je naar de Java 8taalspecificatie §9.4.3, je kunt zien dat er staat:

Een statische methode heeft ook een bloktekst, die zorgt voor de implementatie van de methode.

Er staat dus expliciet dat ze in Java 8 kunnenbestaan.

Ik heb zelfs geprobeerd uw exacte code uit te voeren in Java 1.7.0_45, maar ik kreeg de foutmelding “modifier static not allowed here”.


Hier is een citaat rechtstreeks uit de Java 8-zelfstudie, Standaardmethoden (de Java-taal leren > interfaces en overerving):

Statische methoden

Naast standaardmethoden kunt u statische methodenin
interfaces. (Een statische methode is een methode die is gekoppeld aan de
klasse waarin het is gedefinieerd in plaats van met een willekeurig object. Elk
instantie van de klasse deelt zijn statische methoden.) Dit maakt het gemakkelijker
voor u om hulpmethoden in uw bibliotheken te organiseren; je kan houden
statische methoden die specifiek zijn voor een interface in dezelfde interface eerder
dan in een aparte klas. Het volgende voorbeeld definieert een statische
methode die een ZoneIdobject dat overeenkomt met een tijd
zone-ID; het gebruikt de standaardtijdzone van het systeem als er geen is
ZoneIdobject dat overeenkomt met de opgegeven identifier. (Als resultaat,
je kunt de methode getZonedDateTimevereenvoudigen):

public interface TimeClient {
    // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }
    default public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }    
}

Net als statische methoden in klassen, specificeert u dat een methodedefinitie
in een interface is een statische methode met het trefwoord staticaan de
begin van de handtekening van de methode. Alle methodedeclaraties in een
interface, inclusief statische methoden, zijn impliciet public, dus u
kan de modifier publicweglaten.


Antwoord 3, autoriteit 14%

Voor javaversie 7 of lagerkun je functioneel vergelijkbaar bereiken met geneste klasse gedeclareerd in de interface-body. en deze geneste klasse implementeert de buitenste interface.

Voorbeeld:

interface I1{
    public void doSmth();
    class DefaultRealizationClass implements  I1{
        @Override
        public void doSmth() {
           System.out.println("default realization");
        }
    }
}

Hoe gebruiken we het in onze code?

class MyClass implements I1{
    @Override
    public void doSmth() {
         new I1.DefaultRealizationClass().doSmth();
    }   
}

Daarom is de standaardimplementatie ingekapseld in de interface.

Other episodes