2012-10-04 94 views
0

我有以下類:如何自動填充此課程?

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

5是一個int,而不是IntegerKey。你不能使用int/Integer而不是IntegerKey? – Seitaridis

回答

6

這不編譯,爲什麼?

因爲沒有從intIntegerKey的隱式轉換。您不能在Java中創建用戶定義的隱式轉換。你被這個語言定義的那些卡住了。

您已經要麼有明確得到IntegerKey的保持莫名其妙,或者你有你的地圖類型更改爲Map<Integer, MyCache>

2

這不編譯,爲什麼?

只有原始類型自動裝箱到它們的包裝。 Java中不允許其他組合。

我不想做的事:

map.put(new KeyInteger(5), new MyCache()); 

在這種情況下不使用KeyInteger,只需使用一個整數。

+0

我想我堅持使用這個選項來分配新的IntegerKey,只要我想訪問這張地圖。 – Shvalb

+0

或者你可以像我們所有人建議的那樣使用'Integer'。 :P –

+0

@ user1720101您可以使用靜態工廠方法來集合'KeyInteger'實例。這就是'Integer.valueOf'的作用。 –

2

Autoboxing只適用於原始類型及其各自的計數器部分java.lang。在您的示例中,您可以嘗試完全刪除IntegerKey,並簡單地使用Integer

+0

我給出的例子只是部分。這個IntegerKey類擁有更多的數據成員和邏輯。 – Shvalb

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更多的方法。