我该怎么自动装这个班?

时间:2012-10-04 13:07:41

标签: java boxing autoboxing

我有以下课程:

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());

谢谢。

4 个答案:

答案 0 :(得分:6)

  

这不编译,为什么?

因为没有从intIntegerKey的隐式转换。您无法在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中的方法。可能有更多方法需要重新实现从intIntegerIntegerKey的自动转换,但您应该能够正常使用其余的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());

然后,您可以为IntegerMap.get定义更多方法。