コメントで他の多くの人が指摘しているように、あなたがしようとしていることは静的メソッドでは不可能です。また、静的メソッドはテストとメンテナンスの悪夢につながる可能性があるため、できる限り避けるようにしてください (*)。
メソッドに「getInstance」という名前を付けたので、やりたいことは、Factory パターンと Singleton パターンの組み合わせだと思います。これらのパターンを開始するための情報を次に示します。
シングルトン: http://en.wikipedia.org/wiki/Singleton_pattern
ファクトリ メソッド: http://en.wikipedia.org/wiki/Factory_method_pattern
抽象ファクトリ: http://en.wikipedia.org/wiki/Abstract_factory
最近では、どちらも手動でコーディングするべきではありません (*) - Google Guice や Spring などの優れた "依存性注入" (DI) コンテナーを調べてください。正確に何を達成したいのかは 100% わかりませんが、DI コンテナーがそれを実行してくれるようです。
編集:これは、質問の編集に対する応答です。サブクラスのキャッシュされたインスタンスを受け取りたい。この場合でも、静的メソッドは使用しないことをお勧めします。「BCache」クラスのシングルトン インスタンスを作成し (DI コンテナーを使用するか、手動でプログラミングします)、このキャッシュ オブジェクトを使用して登録済みオブジェクトを検索できます。Guice を DI コンテナーとして使用すると、次のようになります (警告、未テスト)。
@Singleton
public class BCache {
private Map<Class<? extends B>, B> cache = ...;
public <T> T getInstance(Class<? extends T> type) {
return (T) cache.get(type);
}
}
ただし、DIコンテナを使用してキャッシュクラスを完全に取り除くことはまだ可能だと思います。繰り返しますが、これは Guice を使用したテストされていないコードですが、次のようになります。
@Singleton
public class A extends B {
public A() {
//I am not sure if you need to register in this case, because your
//DI container keeps track of the singleton instances.
super.register(this);
}
}
public class SomeClassUsingA {
@Inject private A a;
}
(*) 「すべての一般化は間違っている」ことに注意してください。つまり、一部のプロジェクトでは意味があるかもしれませんが、ほとんどの場合はそうではありません。