4
A a = new A();     //classA {   }

HashMap<String, Object> hm = new Hashmap<String,Object>();

hm.put("A", a);

我的问题是,我怎样才能将对象本身而不是“A”放在同一个声明中?

hm.put(`a??`, a);
4

5 回答 5

3

你根本不能这样做,语言禁止它。仅当您的类A是不可能的子类时才有String可能,因为它是在 JavaString中声明的。final

关于您的面试问题:由于为声明选择了泛型类型参数,这是不可能的。您可以在Bounded Type Parameters中阅读更多相关信息。

于 2012-09-30T18:37:34.310 回答
1
A a = new A();     //classA {   }

Map<A, A> hm = new Hashmap<A, A>();

hm.put(a, a);

但我看不出有任何意义a->a

于 2012-09-30T18:40:30.470 回答
0

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);
于 2012-09-30T18:38:23.640 回答
0

如果您想objectHashMapimmutable..HashMap

试想一下,如果您的键在插入后被更改,您将永远无法找到您插入的值..

但是,如果您的密钥是immutable,那么如果有人试图更改您的密钥,他实际上会为自己创建一个新的,但您仍然拥有您的..

如果您将String其用作您的键HashMap(它们无法更改),就会发生这种情况。因此,如果您希望您的对象成为键,那么您可以让您的类成为 String 的子类(您不能这样做),或者,只是让你的类不可变..

于 2012-09-30T18:40:04.900 回答
0

这实际上可以使用原始类型,如下所示:

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)

这就是为什么你被告知这是一个“肮脏的把戏”。你不应该使用它。

于 2017-02-22T19:14:00.603 回答