Super class method and Interface default method conflict resolution

后端 未结 3 2079
死守一世寂寞
死守一世寂寞 2020-12-03 11:27

Consider the below example,

public class Testing extends SupCls implements Intf {
    public static void main(String[] args) {
        new Testing().test();
         


        
相关标签:
3条回答
  • 2020-12-03 12:15

    Looks like eclipse version matters!

    In Eclipse Luna (4.4.1) the reference points to SupCls instead of Intf

    Probably a bug in Eclipse Mars

    0 讨论(0)
  • 2020-12-03 12:16

    This certainly is a bug in eclipse but in the code completion proposals rather than in the compiler. Hovering over the call to test or Open Declaration take you to the SupCls method and running the code correctly prints "From SupCls" which proves this. Please file a bug against jdt ui for investigation

    0 讨论(0)
  • 2020-12-03 12:19

    Your assumption is right, the concrete method inherited from the superclass takes precedence over the default method from the interface:

    JLS §8.4.8. Inheritance, Overriding, and Hiding

    A class C inherits from its direct superclass and direct superinterfaces all abstract and default (§9.4) methods m for which all of the following are true:

    • No method declared in C has a signature that is a subsignature (§8.4.2) of the signature of m.
    • No concrete method inherited by C from its direct superclass has a signature that is a subsignature of the signature of m.

    The second cited bullet applies here, there is a concrete method inherited from the direct superclass with an appropriate signature, so the default method is not inherited.

    The documentation even clears any doubt with an additional remark:

    Note that it is possible for an inherited concrete method to prevent the inheritance of an abstract or default method. (Later we will assert that the concrete method overrides the abstract or default method "from C".)

    So it’s like SupCls.test() overrides Intf.test() when it comes to class Testing.

    In other words, you are right, it’s a bug in Eclipse, but as long as it only affects the way the proposal is rendered, I’d consider it a minor bug. The inserted source will be the same, regardless of whether a D has been rendered in the proposal or not.

    0 讨论(0)
提交回复
热议问题