blog.smart-java.nl
Ordina J-Technologies – Java Blog



Java 6 undocumented change: @Override

By: Jan-Kees van Andel, 15 October 2008

Het valt me op projecten al een tijdje op dat collega’s compilatiefouten krijgen op @Override. Deze fouten kreeg ik zelf nooit. Gisteren tijdens de JSF cursus gebeurde het weer. Weer twee mensen die tegen deze fout aan liepen. Bij de rest van de groep ging het goed, maar bij deze twee niet, ondanks dat ze dezelfde stappen doorliepen als de rest.

In de code kwamen een stuk of 20 compile errors naar voren, allemaal gerelateerd aan @Override. De melding was:

The method [METHODNAME] of type [CLASSNAME] must override a superclass method

Het probleem is een aanpassing die in Java 6 is gemaakt. In Java 5 mag deze annotation alleen op een method staan die een method uit een klasse override. Of de method in de superclass abstract is en of de superclass zelf abstract is, maakt niet uit. Wat wel uitmaakt in Java 5, is dat een method die een interface method implementeert, niet met @Override geannoteerd mag zijn.

Dit mag dus niet in Java 5.

interface MyInterface {
    void doSomething();
}
 
class MyImplementation implements MyInterface {
    // Error in Java 5: The method doSomething() of type MyImplementation must override a superclass method
    @Override
    void doSomething() {}
}

Het vervelende was dat Eclipse die annotaties neer had gezet omdat mijn Compiler Compliance Level op 6 stond en ik een Java 6 compiler gebruikte, maar niet iedere cursist gebruikte Java 6.

Leuk detail: We hebben het hier over een (per ongeluk) niet gedocumenteerde feature van Java 6. Zie Peter Ahé’s weblog.
http://blogs.sun.com/ahe/entry/override
http://blogs.sun.com/ahe/entry/override_snafu

4 reacties op “Java 6 undocumented change: @Override”

  1. Jan-Kees van Andel zegt:

    Let btw op de foutmelding. Die geeft in feite het probleem al aan. Je moet een methode uit een superCLASS overriden, niet een methode uit een superTYPE.

  2. Roy van Rijn zegt:

    Tja opzich wel logisch dat het niet geldt voor interfaces… override is iets anders dan implement. Toch vreemd dat voor Java 5 en 6 een andere benadering gekozen is, daarvan was ik me nog niet bewust.

    Maar het is ook weer logisch dat je een dergelijke annotation zou willen hebben bij een interface methode (misschien @Implements?). Al is het zo dat de meeste IDE’s klagen als je een interface methode mist, dus mocht je het toevallig wijzigen (waar de annotation voor waakt) komt er direct een melding van je IDE natuurlijk…

    Leuke wijziging in ieder geval! :)

  3. Vincent zegt:

    In eerste instantie vond ik die @Override annotatie maar lelijk en begreep ik niet wat het nut er van was. Elke IDE ondersteunt dit toch?

    Totdat ik zag hoe andere ontwikkelaars code gingen refactoren. Met name: methodes gingen hernoemen…

    (Met het handje dus.)

    Nu ben ik er blij mee.

  4. Jan-Kees van Andel zegt:

    Het is ook prettig als je mensen op het project hebt die nog niet zo lang met Java werken.

    Die gaan dan bijvoorbeeld een equals(Object) herschrijven naar equals(Persoon), maar hebben dan niet door dat ze hiermee de klasse slopen…

    @Override geeft dan iig wat bewustwording. En dan hoop ik maar dat ze ff vragen waarom deze fout optreedt, in plaats van de @Override weg te gooien. (want dan compiled het ook ;) )

Laat een reactie achter