我想構建一個使用 Map 快取 CachedObject 型別的類的類。
public class CachedObject {
protected Long id;
public CachedObject(Long id) {
this.id = id;
}
}
下面是工廠類。
public class CachedObjectFactory<T extends CachedObject> {
private static Logger logger = LoggerFactory.getLogger(CachedObjectFactory.class);
private Map<Long, T> cacheMap = new HashMap<>();
public T get(Class<T> type, Long id) throws CachedObjectInstantiationException {
T cachedObject = cacheMap.get(id);
try {
if(cachedObject == null) {
cachedObject = type.getDeclaredConstructor().newInstance(id);
}
} catch(Exception e) {
throw new CachedObjectInstantiationException(e.getMessage());
}
return cachedObject;
}
}
我有一個擴展 CacheableObject 的類,如下所示:
@Component
class X extends CachedObject {
public X(Long id) {
super(id);
}
....
}
當我嘗試使用工廠中的 get 方法創建擴展 CachedObject 的類 X 的實體時,如下所示:(請注意,cachedObjectFactory 是使用 Spring 自動裝配的)
@Component
class Y extends CachedObject {
CachedObjectFactory<CachedObject> cachedObjectFactory;
Y(Long id, CachedObjectFactory cachedObjectFactory) {
super(id);
this.cachedObjectFactory = cachedObjectFactory;
}
public void someMethod() {
X x = cachedFactory.get(X.class, id);
}
}
我收到編譯時錯誤“CachedObjectFactory 型別中的方法 get(Class, Long) 不適用于引數 (Class, Long)”。我應該如何使用工廠方法實體化物件 X?
uj5u.com熱心網友回復:
將欄位宣告為CachedObjectFactory<CachedObject>實際上并沒有任何意義——該引數已經具有CachedObject上限。
您可以通過將工廠更改為如下所示來編譯代碼:
public class CachedObjectFactory {
private Map<Long, Object> cacheMap = new HashMap<>();
public <T extends CachedObject> T get(Class<T> type, Long id) {
T cachedObject = (T)cacheMap.get(id);
try {
if(cachedObject == null) {
cachedObject = type.getDeclaredConstructor().newInstance(id);
}
} catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
return cachedObject;
}
}
當您將工廠用于許多類時,使其通用并沒有真正意義。
當然,如果不同子類的兩個實體CachedObject具有相同的 id,您將獲得一個 runtime ClassCastException。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426112.html
下一篇:Swift代碼找不到資料的符號
