他のクラスのメタデータを保持する (ジェネリック) クラスがあります。メタデータはいくつかの方法で使用されます (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()
これを解決する方法についてのアイデアはありますか?