morristech
5/10/2018 - 9:06 AM

Covariant return types generate an extra method in bytecode. This compounds in each subclass further specializing the type.

Covariant return types generate an extra method in bytecode. This compounds in each subclass further specializing the type.

interface Thing {
  Object thing();
}

class CharSequenceThing implements Thing {
  @Override public CharSequence thing() {
    return "CharSequence!";
  }
}

class StringThing extends CharSequenceThing {
  @Override public String thing() {
    return "String!";
  }
}
$ javap -p Thing CharSequenceThing StringThing

Compiled from "CovariantReturnTypes.java"
interface Thing {
  public abstract java.lang.Object thing();
}

Compiled from "CovariantReturnTypes.java"
class CharSequenceThing implements Thing {
  CharSequenceThing();
  public java.lang.CharSequence thing();
  public java.lang.Object thing();
}

Compiled from "CovariantReturnTypes.java"
class StringThing extends CharSequenceThing {
  StringThing();
  public java.lang.String thing();
  public java.lang.CharSequence thing();
  public java.lang.Object thing();
}