Java中扩展HashMap报错:MyRecord类型不接受参数
让我来帮你梳理下这个问题的根源,以及对应的解决办法:
问题出在哪?
你定义的MyRecord类继承的是HashMap<String, String>——这是一个已经绑定了具体泛型类型的HashMap实现,也就是说MyRecord本身并不是一个泛型类,它的键值类型已经固定死是String了。所以当你尝试用MyRecord<String, String>来声明ArrayList的元素类型时,编译器自然会报错“MyRecord类型不接受参数”,因为它根本不是泛型类,不需要(也不能)传泛型参数。
两种修复方案,你可以根据需求选:
方案1:如果MyRecord确实只需要存储<String, String>类型的键值对
直接去掉声明时的泛型参数即可,同时可以优化下构造函数(你原来的第一个构造函数传了k和v但没存进去,有点浪费参数):
// 优化后的MyRecord类 public class MyRecord extends HashMap<String, String>{ // 直接把传入的k-v存入Map public MyRecord(String k, String v){ super(); put(k, v); } public MyRecord(Map<String, String> t) { super(t); } public String getVal(String key) { return this.get(key); } } // 正确的ArrayList声明 ArrayList<MyRecord> dataList = new ArrayList<>();
方案2:让MyRecord支持自定义泛型类型(更灵活)
如果你希望MyRecord能像原生HashMap一样支持任意的键值类型,那就把MyRecord改成泛型类,继承泛型版本的HashMap<K, V>:
// 泛型版MyRecord类 public class MyRecord<K, V> extends HashMap<K, V>{ public MyRecord(K k, V v){ super(); put(k, v); } public MyRecord(Map<? extends K, ? extends V> t) { super(t); } public V getVal(K key) { return this.get(key); } } // 你原来的声明现在就能正常用了 ArrayList<MyRecord<String, String>> dataList = new ArrayList<>();
内容的提问来源于stack exchange,提问作者me_digvijay
相关产品推荐
相关产品推荐

