A a = new A(); //classA { }
HashMap<String, Object> hm = new Hashmap<String,Object>();
hm.put("A", a);
我的问题是,我怎样才能将对象本身而不是“A”放在同一个声明中?
hm.put(`a??`, a);
你根本不能这样做,语言禁止它。仅当您的类A
是不可能的子类时才有String
可能,因为它是在 JavaString
中声明的。final
关于您的面试问题:由于为声明选择了泛型类型参数,这是不可能的。您可以在Bounded Type Parameters中阅读更多相关信息。
A a = new A(); //classA { }
Map<A, A> hm = new Hashmap<A, A>();
hm.put(a, a);
但我看不出有任何意义a->a
If the class held a non-changing decent String field, you could use that.
// the id property must be a String, immutable and unique for each instance!
myMap.put(a.getId(), a);
如果您想object
在您HashMap
的immutable
..HashMap
试想一下,如果您的键在插入后被更改,您将永远无法找到您插入的值..
但是,如果您的密钥是immutable
,那么如果有人试图更改您的密钥,他实际上会为自己创建一个新的,但您仍然拥有您的..
如果您将String
其用作您的键HashMap
(它们无法更改),就会发生这种情况。因此,如果您希望您的对象成为键,那么您可以让您的类成为 String 的子类(您不能这样做),或者,只是让你的类不可变..
这实际上可以使用原始类型,如下所示:
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)
这就是为什么你被告知这是一个“肮脏的把戏”。你不应该使用它。