我試圖總結(並簡化)的MapDB庫在我的項目是這樣的:正確的方法來包裝非通用類與通用的一個
public class MapDbPersistentStorage<V> { private DB db; private HTreeMap<String, V> storage; public MapDbPersistentStorage(String filename) { db = DBMaker .fileDB(filename) .fileMmapEnable() .make(); storage = (HTreeMap<String, V>) db .hashMap("section", Serializer.STRING, Serializer.LONG) .createOrOpen(); } public V get(String key, V defaultValue) { return storage.getOrDefault(key, defaultValue); } public void set(String key, V value) { storage.put(key, value); } public void close() { db.close(); } }
由於它已經指出的那樣,問題是Serializer.LONG
部分(它應該是V
)。我需要提供一個基於所提供的泛型類型的序列化程序。什麼是正確的做法?
將'Serializer'傳遞給包裝器的構造函數。 –
這並不意味着我會兩次傳遞'Long'類型嗎?曾經作爲一個通用參數,曾經作爲一個構造參數?你不認爲這是一個壞主意,因爲可以提供兩種不兼容的類型? – Mehran
是的,但是你需要兩次,一次是在編譯時(泛型),另一次是在運行時(串行器)。如果你想讓它更安全,你可以將'Serializer'封裝在一個通用類型的序列化器的通用接口中,然後將該接口作爲參數。 –