他のクラスのメタデータを保持する (ジェネリック) クラスがあります。メタデータはいくつかの方法で使用されます (XML データの書き込みと読み取り、データベース、テキストとしての出力など)。これまでのところ、これは機能します。しかし、他のクラスから継承されたクラスにこれらすべてを使用すると、問題が発生しました。
次のコードを見てください (下にマークされた行を除いて、コンパイル可能な最小限の例を作成しようとしました)。
class A {
  public Meta<? extends A> getMeta() {
    return new Meta<A>();
  }
  public void output() {
    /*
     * Error shown in eclipse for the next line:
     * The method output(capture#1-of ? extends A) in the type
     * Outputter<capture#1-of ? extends A> is not applicable for the arguments
     * (A)
     */
    getMeta().getOutputter().output(this);
  }
}
class B extends A {
  @Override
  public Meta<? extends B> getMeta() {
    return new Meta<B>();
  }
}
class Meta<CLS> {
  public Outputter<CLS> getOutputter() {
    return null;
  }
}
class Outputter<CLS> {
  public void output(CLS obj) {
  }
}
A.getMeta()上記の行をコンパイルするために戻るように変更できますが、クラス B のMeta<A>ようにオーバーライドすることはできません。Meta<B> getMeta()
これを解決する方法についてのアイデアはありますか?