2013-07-19 27 views
-1

我在嘗試查看是否修改自定義緩存實現以在LinkedHashMap而不是​​中使用泛型。我認爲<Object, Object>是合適的,但最佳做法是什麼?泛型的使用是否有意義?在自定義LinkedHashMap緩存類中使用泛型

public class Cache extends LinkedHashMap<Object, Object>{ 
    private static final long serialVersionUID = -4297992703249995219L; 
    private final int cacheSize; 
    public Cache(int size){ 
     super(size + 1, .75f, true); 
     this.cacheSize=size; 
    } 

    protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) { 
     return size() > cacheSize; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Cache cache = new Cache(2); 
     cache.put(1, "one"); 
     cache.put(2, "two"); 

     for(Entry<Object, Object> entry : cache.entrySet()){ 
      System.out.println(entry.getKey() + ":" + entry.getValue()); 
     } 
    } 
} 
+0

你應該使通用鑄造。 – SLaks

+0

@SLaks - 當我嘗試的時候,我無法編譯它... – c12

+0

這段代碼段中有沒有強制轉換? –

回答

2

如果你希望你的Cache類是通用的,以及,聲明它是這樣:

public class Cache<K,V> extends LinkedHashMap<K,V>{ 

然後你可以聲明,例如,

Cache<Integer,String> cache = new Cache<>(); 
... 
cache.put(1,"String 1"); 
cache.put(2,"String 2"); 

但是,如果有什麼你想要的是一個異構集合,你可以做什麼

cache.put(1,"String 1"); 
cache.put(new MyObject1(), new SomeOtherObject()); 

然後這擴展了Java通用系統的功能。您需要使用<Object,Object>併爲每個條目保存一個類標記,以便您可以在需要時瞭解運行時類型。

+0

這將如何影響for(Entry ...我試過Entry 但它不會編譯任何想法? – c12

+0

''只在'Cache'類中有意義。必須指定實際的類。在你的情況下,它會是'Entry ' –