Java 6 undocumented change: @Override
By: Jan-Kees van Andel, 15 October 2008Het 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


15 October 2008 om 9:02 pm
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.
16 October 2008 om 12:44 am
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!
21 October 2008 om 9:20 pm
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.
24 October 2008 om 10:27 am
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
)