2013-05-13 97 views
1

我一直在试图创建一个包含2个键的自定义HashMap。 用户用两个参数KV创建我的课程的一个对象。班级由2 HashMaps组成:本地扩展<Integer, V>和密钥存储<K, Integer>。 基本上,每个值有两个键:KInteger创建自定义多键HashMap

当用户想要获取某个项目时,他可以通过使用K密钥或Integer密钥来检索这两个项目。因此,举例来说,如果用户使用K则系统会查找keyTable对于这样关键的整数,然后使用该Integer找到该值V

public class KeyMap<K, V> extends ConcurrentHashMap<Integer, V> { 

    private HashMap<K, Integer> keyTable = new HashMap<K, Integer>(10); 

    @Override 
    public V get(Object key) { 
     if (key instanceof V) { 
      return super.get(keyTable.get(key)); 
     } 
     return super.get(key); 
    } 

} 

不过,我因此以前没有做过的参数我不明白是什么问题 - 我得到Cannot perform instanceof check against type parameter V. Use instead its erasure Object instead since further generic type information will be erased at runtime在线if (key instanceof V) {

是否有可能实现我想要的系统?

+1

不要继承;封装。 http://books.google.com/books?id=Ft8t0S4VjmwC&lpg=PR1&dq=effective%20java&pg=PA81#v=onepage&q&f=false – 2013-05-13 20:15:36

+0

由于类型擦除,您需要接受'Class '实例。 – SLaks 2013-05-13 20:16:04

+0

听起来像是你想要一个bimap - http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/BiMap.html – 2013-05-13 20:21:56

回答

1

在运行时执行的任何操作(例如instanceof运算符)中不能使用参数化类型(K和V)。在Java中,所有参数化信息都在编译时使用,然后从编译代码中删除。这种删除被称为类型删除。 1

我建议你不要依赖键的类型来确定要查找哪个HashMap,而是看看键是否是第一个HashMap的有效键,如果没有,请尝试第二个键。请记住,K可以是Integer类型,这意味着两种类型的键都可以是相同的。

+0

如何测试密钥是否为HashMap的有效密钥? – 2013-05-14 10:15:30

+0

一种方法是使用HashMap的containsKey(Object key)方法。如果返回false,则该键对该HashMap无效,因为没有值与该键相关联。 [链接](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#containsKey%28java.lang.Object%29) – 2013-05-14 10:28:56

+0

哦,我的意思是如果可能的话检查HashMap键是String还是Integer类型。因为例如,如果我使用String作为Intected Keys的键,它将不起作用。 – 2013-05-14 10:39:11