Poate o metodă de interfață să aibă un corp? (Programare, Java, Interfață, Java 8, Implementare Implicită)

user3034861 a intrebat.
a intrebat.

Știu că o interfață este ca o clasă abstractă 100% pură. Deci, nu poate avea implementare de metode în ea. Dar, am văzut un cod ciudat. Poate cineva să-l explice?

Fragment de cod:

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

EDIT:

IDE-ul meu este Intellij Idea 13.1. SDK-ul proiectului este java 7 <1.7.0_25>. IDE nu afișează nicio eroare de compilator. Dar, atunci când compilez codul în linia de comandă, primesc următorul mesaj.

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

Comentarii

  • se dă o eroare. Jdk 1.6 –  > Por sanbhat.
  • Acest lucru este imposibil în Java –  > Por Salah.
  • 37

  • Java8 permite corpul metodei implicite pentru interfețe. –  > Por sp00m.
  • Java 8, da. Înainte de acesta, nu. –  > Por Ian McLaird.
  • Doar în Java 8 au fost introduse metode implicite. Înainte de asta, nu.  > Por Omoro.
3 răspunsuri
Aniket Kulkarni

Adus de la Java 8 puteți defini metode statice în interfețe, pe lângă metodele implicite.

  • O metodă statică este o metodă care este asociată cu clasa în care este definită și nu cu orice obiect. Fiecare instanță a clasei împarte metodele sale statice.

  • Acest lucru vă permite să organizați mai ușor metodele auxiliare în bibliotecile dumneavoastră; puteți păstra metodele statice specifice unei interfețe în aceeași interfață, mai degrabă decât într-o clasă separată.

  • Exemplul următor definește o metodă statică care recuperează un obiect ZoneId care corespunde unui identificator de fus orar; aceasta utilizează fusul orar implicit al sistemului dacă nu există un obiect ZoneId obiect corespunzător identificatorului dat. (Ca urmare, puteți simplifica metoda getZonedDateTime)

Iată codul :

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));
   }    
}

A se vedea și

Comentarii

  • De asemenea, implementări implicite ale metodelor. –  > Por Ian McLaird.
  • Nu folosesc java 8. Este javac 1.7.0_25. – user3034861
  • IDE-ul dvs. utilizează conformitatea codului 8? Asta ar trebui să nu compila cu 7 și mai jos. Iată un articol bun. –  > Por Giovanni Botta.
  • @Phoenix Și eu folosesc versiunea 1.7.0_25, dar nu este permisă în această versiune –  > Por Shekhar Khairnar.
  • Acest lucru pare să estompeze cu adevărat liniile dintre interfețe și clasele abstracte. –  > Por asteri.
Tipul cu pălăria

Acest lucru este posibil doar în Java 8. În Java 7 Specificația limbajului §9.4, , se precizează în mod explicit:

Este o eroare la compilare dacă o metodă declarată într-o interfață este declarată statică, deoarece metodele statice nu pot fi abstracte.

Prin urmare, în Java 7, metodele statice din interfețe nu pot fi definite exista.

Dacă mergeți la pagina Java 8 Specificația limbajului §9.4.3, , puteți vedea că se spune:

O metodă statică are, de asemenea, un corp de bloc, care furnizează implementarea metodei.

Astfel, se afirmă în mod explicit că în Java 8, ele pot exista.

Am încercat chiar să rulez codul dvs. exact în Java 1.7.0_45, dar mi-a dat eroarea „modifier static not allowed here”.


Iată un citat direct din Java 8 tutorial Java 8, Metode implicite (Învățarea limbajului Java > Interfețe și moștenire):

Metode statice

În plus față de metodele implicite, puteți defini metode statice în interfețe. (O metodă statică este o metodă care este asociată cu clasa în care este definită și nu cu orice obiect. Fiecare instanță a clasei împarte metodele sale statice). Acest lucru vă facilitează organizarea metodelor ajutătoare în bibliotecile dumneavoastră; puteți păstra metodele statice specifice unei interfețe în aceeași interfață, mai degrabă decât într-o clasă separată. Exemplul următor definește o metodă statică care recuperează un obiect ZoneId care corespunde unui identificator de fus orar; aceasta utilizează fusul orar implicit al sistemului dacă nu există un obiect ZoneId obiect corespunzător identificatorului dat. (Ca urmare, puteți simplifica metoda getZonedDateTime):

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));
    }    
}

La fel ca și în cazul metodelor statice din clase, puteți specifica faptul că o definiție de metodă dintr-o interfață este o metodă statică cu ajutorul parametrului static la începutul semnăturii metodei. Toate declarațiile de metode dintr-o interfață, inclusiv metodele statice, sunt implicit public, , astfel încât puteți omite semnul public modificator.

gstackoverflow

Pentru java versiunea 7 sau mai mică, , similar din punct de vedere funcțional se poate realiza folosind clasa imbricata declarată în corpul interfeței. și această clasă imbricata implementează interfața exterioară.

Exemplu:

interface I1{
    public void doSmth();

    class DefaultRealizationClass implements  I1{

        @Override
        public void doSmth() {
           System.out.println("default realization");
        }
    }
}

Cum o folosim în codul nostru?

class MyClass implements I1{

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

Prin urmare, implementarea implicită încapsulată în cadrul interfeței.