A a = new A(); //classA { }
HashMap<String, Object> hm = new Hashmap<String,Object>();
hm.put("A", a);
我的问题是,我怎样才能将Object本身而不是“A”放在同一个声明中?
hm.put(`a??`, a);
答案 0 :(得分:3)
你根本做不到,语言禁止它。只有当您的类A
是String
的子类时才有可能这是不可能的,因为String
在Java中被声明为final
。
关于你的面试问题:由于为声明选择的泛型类型参数,这是不可能的。您可以在Bounded Type Parameters中了解更多相关信息。
答案 1 :(得分:0)
如果该类持有一个不变的体面字符串字段,则可以使用它。
// the id property must be a String, immutable and unique for each instance!
myMap.put(a.getId(), a);
答案 2 :(得分:0)
如果您想将 object
作为 HashMap
中的关键字,那么该对象必须为 {{ 1}} ..因为,在您将密钥添加到immutable
之后,您不希望任何人更改密钥。
想象一下,如果您的密钥在插入后更改,您将无法找到插入的值..
但如果您的密钥是HashMap
,那么如果有人试图更改您的密钥,他实际上会为自己创建一个新密钥,但您仍然会拥有自己的密钥......
如果您使用immutable
作为String
中的密钥(它们无法更改),就会发生这种情况。所以,如果您希望自己的对象成为密钥,则要么你的类是String的子类(你不能这样做),或者只是让你的类不可变..
答案 3 :(得分:0)
A a = new A(); //classA { }
Map<A, A> hm = new Hashmap<A, A>();
hm.put(a, a);
但我认为放a->a
答案 4 :(得分:0)
这实际上可以使用raw type,如下所示:
Object key = ...;
Object value = ...;
Map<String, Integer> map = new HashMap<>();//a normal map
Map rawMap = map; // here is the raw type
rawMap.put(key, value); // it works!
这样运行正常,但是当您稍后尝试使用通用映射时会出现问题:
Integer value = map.get(key);// ClassCastException (unless value actually is an Integer)
这就是为什么你被告知这是一个肮脏的伎俩&#34;。 You shouldn't use it.