2015-09-09 19 views
-2

在下面的代碼中,interface Dictionary有一些使用Object類型作爲參數的方法。本字典代碼中是否需要Java泛型?

/* Dictionary.java */ 

package cs61b.homework6.dict; 

public interface Dictionary { 

    public int size(); 

    public boolean isEmpty(); 

    class Entry { 

     protected Object key; 
     protected Object value; 

     public Object key() { 
      return key; 
     } 

     public Object value() { 
      return value; 
     } 

    } 


    public Entry insert(Object key, Object value); 
    public Entry find(Object key); 

    public Entry remove(Object key); 

    public void makeEmpty(); 

} 
下面

是實施interface Dictionaryclass HashTableChained

/* HashTableChained.java */ 

package cs61b.homework6.dict; 

import java.util.ArrayList; 
import java.util.Iterator; 

import JavaCollections.list.DblyLinkList; 

public class HashTableChained implements Dictionary { 

    private long tableSize; 
    private ArrayList<DblyLinkList<Entry>> defTable; 

    public HashTableChained(long sizeEstimate) {... } 

    public HashTableChained() { ... } 
    private static boolean isPrime(long n) { ...} 
    private static long nextPrime(long previous) { .. } 

    int compFunction(int code) { ... } 

    public int size() { ... } 

    public boolean isEmpty() { ... } 

    public Entry insert(Object key, Object value) { ... } 

    public Entry find(Object key) { ... } 

    public Entry remove(Object key) { ... } 

    public void makeEmpty() { ...} 

} 

我想了解,是否有引進interface Dictionary<K, V>語法與K keyV value的優勢呢?

注:Java初學者。完整的代碼可用here。老師鼓勵編寫自己的包,而不是使用java.util收集包。

+5

..類型安全? –

+0

爲什麼你不實現java.util.Map 接口? –

+0

由於你在'Entry'中看起來沒有'Key'和'Value'的setter,所以來自泛型的類型安全性不會是編譯時的那種helpfull。 – SomeJavaGuy

回答

5

有一個優點。它通過驗證你沒有做任何完全錯誤的事情(比如放置一個鍵或者一個錯誤類型的值)來保證你在編譯期間的安全(r)。

它也將刪除(大部分)在使用地圖時投入代碼的需要。

如果使用EntryObject S作爲鍵和值做字數:

Dictionary dict = new Dictionary(); 

dict.insert("word", new Integer(42)); 

Object count = dict.find("word"); // gives an Object, not an Integer 

// need to cast - annoying, not safe 
Integer countAsInteger = (Integer)count; 

如果引入了泛型:

Dictionary dict = new Dictionary<String, Integer>(); 

dict.insert("word", new Integer(42)); 

Integer count = dict.find("word"); // gives an Integer 

通用打字還可以保護您創建一個異類地圖。在你執行這個是允許的:

dict.insert("word", "42"); 

但它可能是一個錯誤。你打算計數爲Integer

在一般的實現,你將能夠實現:

public void insert(K key, V value); 

這將不會允許(在編譯時)比K和地圖V的任何其他。

+0

@lschuetze猜我不是完全遵循什麼是庫代碼和他的代碼是什麼。 –

+0

對於你的觀點:*喜歡把一個鍵或一個錯誤類型的值*,沒有人可以阻止我說'dict.insert(12345,新的整數(42));'。所以,通用語法看起來顯然是必需的對不起,我是初學者。我認爲'key.hashCode()'會運行'整數。在這種情況下hashCode',是否正確? – overexchange

+0

如果是「Dictionary 」這個語句:'dict.insert(12345,new Integer(42));'不會編譯。如果你使用密鑰的'hashCode'而不是運行,是的。但它會運行(沒有泛型)。這是一個使用散列的字典。 –