代码之家  ›  专栏  ›  技术社区  ›  overexchange

此字典代码中是否需要Java泛型?

  •  -2
  • overexchange  · 技术社区  · 9 年前

    在下面的代码中, interface Dictionary 有一些方法使用 Object 类型作为参数。

    /* 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();
    
    }
    

    下面是实现 class 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 key V value ?

    注意:Java初学者。完整的代码可用 here 。老师鼓励自己编写软件包,而不是使用 java.util 收集包。

    1 回复  |  直到 9 年前
        1
  •  5
  •   Reut Sharabani    9 年前

    这是一个优势。它将通过验证您没有做任何完全错误的事情(如放置错误类型的键或值)来确保编译期间的安全。

    它还将消除(大部分)在使用映射时对代码进行强制转换的需要。

    如果您使用 Entry 具有 Object 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 在地图中。