正如许多其他人在评论中指出的那样,您尝试做的事情是静态方法不可能实现的。另外,您应该尽可能避免静态方法,因为它们可能会导致测试和维护噩梦 (*)。
你将你的方法命名为“getInstance”,所以我guess你想要做的是工厂模式和单例模式的混合。以下是一些可帮助您开始了解这些模式的信息:
单例:http://en.wikipedia.org/wiki/Singleton_pattern http://en.wikipedia.org/wiki/Singleton_pattern
工厂方法:http://en.wikipedia.org/wiki/Factory_method_pattern http://en.wikipedia.org/wiki/Factory_method_pattern
抽象工厂:http://en.wikipedia.org/wiki/Abstract_factory http://en.wikipedia.org/wiki/Abstract_factory
如今,两者都不应该手动编码 (*) - 看看一个好的“依赖注入”(DI) 容器,如 Google Guice 或 Spring。我不是 100% 确定你到底想要实现什么,但看起来 DI 容器会为你做到这一点。
Edit:这是对问题编辑的回应。您想要接收子类的缓存实例。在这种情况下,我仍然建议不要使用静态方法。您可以创建“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;
}
(*) 请注意“所有概括都是错误的”,也就是说,在某些项目中它可能有意义,但在大多数项目中则不然。