Java generics - overriding an abstract method and having return type of the subclass

后端 未结 3 1683
遥遥无期
遥遥无期 2021-02-19 06:07

I am trying to create a set up where a set of subclasses override a superclass. This superclass contains an abstract method - the return type of which would ideally be that of t

3条回答
  •  生来不讨喜
    2021-02-19 06:50

    Here is how to do it (Since JDK 1.5 there is this thing called covariant return types, where something like this is possible).

    abstract class SuperClass>{
      public abstract T getSelf();
    }
    
    class SubClass extends SuperClass {
      public SubClass getSelf() { return this; }
    }
    
    public class Generics {
      public static void main(String[] args) {
        System.out.println(new SubClass().getSelf());
      }
    }
    

    Notice a similar class generic definition with Enum (http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)

    See what happens behind the scenes (by using javap SuperClass SubClass):

    class SubClass extends SuperClass{
        SubClass();
        public SubClass getSelf();
        public SuperClass getSelf();
    }
    
    abstract class SuperClass extends java.lang.Object{
        SuperClass();
        public abstract SuperClass getSelf();
    }
    

    Notice how the subclass method has a different return type, which is a subtype of the super method return type.

    Btw, notice that public SuperClass getSelf(); in class SubClass is actually a synthetic method.

提交回复
热议问题