Static method access dilemma and proposal: @NotInherited

Zhong Yu zhong.j.yu at gmail.com
Thu Jun 27 14:17:37 PDT 2013


Stephen, would it be more accurate to say that what you want is
actually non-"overridable". It's not a problem that B inherits foo()
from A. It is a problem that B may introduce its own foo(), therefore
the meaning of `B.foo()` is a little uncertain.

Non-overridable can be achieved by "final" on instance methods.

For static methods, oddly enough, "final" has the same effect - it
prevents subclass to introduce a method with the same signature -

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.3

It is a compile-time error to attempt to override or hide a final method.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.2

If a class declares a static method m, then the declaration m is said
to hide any method m', where the signature of m is a subsignature
(§8.4.2) of the signature of m', in the superclasses and
superinterfaces of the class that would otherwise be accessible to
code in the class.

Therefore if we have

    class A

        final static void foo(){}

    class B

        static void foo(){}

B should not compile. (Unfortunately, it does compile in javac 7. A bug?)

So can we say "final" static method already does what you want to achieve?


Zhong Yu


More information about the lambda-dev mailing list