我有以下课程:
public class IntegerKey extends Number implements Comparable<IntegerKey> {
private Integer m_key;
public IntegerKey(Integer key) {
m_key = key;
}
public IntegerKey(int key) {
m_key = key;
}
}
我想将此课程用作关注:
假设我有以下泛型:
Map<IntegerKey, MyCache> map = new HashMap<IntegerKey, MyCache>();
map.put(5, new MyCache());
这不编译,为什么?我不想这样做:
map.put(new IntegerKey(5), new MyCache());
谢谢。
答案 0 :(得分:6)
这不编译,为什么?
因为没有从int
到IntegerKey
的隐式转换。您无法在Java中创建用户定义的隐式转换。你坚持使用语言定义的那些。
你要么要以某种方式明确地获取IntegerKey
,要么你必须将你的地图类型更改为Map<Integer, MyCache>
。
答案 1 :(得分:2)
这不编译,为什么?
只有原始类型会自动装入包装器。 Java中不允许其他组合。
我不想这样做:
map.put(new KeyInteger(5), new MyCache());
在这种情况下,不要使用KeyInteger,只需使用整数。
答案 2 :(得分:2)
自动装箱仅适用于java.lang
中的基元类型及其各自的计数器部件。在您的示例中,您可以尝试完全删除IntegerKey
,只需使用Integer
。
答案 3 :(得分:0)
看到有关IntegerKey
特殊功能的评论,在新类中包含您要求的功能似乎是合乎逻辑的(以下示例中的MHashMap):
import java.util.HashMap;
class IntegerKey extends Number implements Comparable<IntegerKey> {
private Integer m_key;
public IntegerKey(Integer key) {
m_key = key;
}
public IntegerKey(int key) {
m_key = key;
}
//...Functionality
//...required methods to include to actually test
@Override
public int compareTo (IntegerKey arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public double doubleValue () {
// TODO Auto-generated method stub
return 0;
}
@Override
public float floatValue () {
// TODO Auto-generated method stub
return 0;
}
@Override
public int intValue () {
// TODO Auto-generated method stub
return 0;
}
@Override
public long longValue () {
// TODO Auto-generated method stub
return 0;
}
}
class MyCache {}
class MHashMap extends HashMap<IntegerKey, MyCache> {
public void put (int key, MyCache value) {
super.put(new IntegerKey(key), value);
}
public void put (Integer key, MyCache value) {
super.put(new IntegerKey(key), value);
}
//...Useful to include other wrappings
public MyCache get (int key) {
return super.get(new IntegerKey(key));
}
public MyCache get (Integer key) {
return super.get(new IntegerKey(key));
}
}
public class AutoboxFix {
public static void main (String[] args) {
//needed to explicitly declare map as MHashMap for "override" to work
MHashMap map = new MHashMap();
//compiles
map.put(5, new MyCache());
//... get probably works with your extended functionality
}
}
这应该提供您所寻找的功能。 get方法取决于Comparable
中的方法。可能有更多方法需要重新实现从int
或Integer
到IntegerKey
的自动转换,但您应该能够正常使用其余的HashMap功能。有必要将map声明为MHashMap
类型,因为使用Map
将无法编译。将类分成他们自己的文件并将其公开是明智的。
如果绝对有必要将地图声明为Map<IntegerKey, MyCache>
,则此方法无效。你可以制作一个静态的方法,你可以使用地图等来为你做转换:
public class AClass {
public static void myPutMethod (Map<Integer, MyCache> map, int key,
MyCache value) {
map.put(new IntegerKey(key), value);
}
}
使用:
myPutMethod(map, 5, new MyCache());
然后,您可以为Integer
和Map.get
定义更多方法。