2012-09-17 45 views
0

我對以下內容感興趣:
構建一個Map<SomeObject<?>, ?>。我想用2個列表來添加鍵和值:如何添加到無界列表? (仿製藥)

List<SomeObject<?>> keys; 
List<?> values; 

但我不知道如何在這個列表中添加對象。有任何想法嗎?
這是使用的this延續@Ivan想法

+0

你有什麼試過,爲什麼它沒有工作?這看起來很簡單,所以一個例子可能是爲了展示你真正想要做的事情。 – bdares

+0

@bdares:我沒有說它不起作用。我說我不知道​​如何建立將包含不同類型對象的列表(混合列表) – Jim

+0

我的意圖是建立列表並根據@ Ivan的想法在我提供的鏈接中填充地圖 – Jim

回答

1

每個條目可能是不同的,但鍵值對必須是相同的T

你不能做到這一點單獨使用字段聲明。

你可以做的是提供getter/setter來執行每個條目的檢查。

final Map<Class, Object> classObjectMap = new LinkedHashMap<Class, Object>(); 

public <T> void putMap(Class<T> tClass, T t) { 
    classObjectMap.put(tClass, t); 
} 

@SuppressWarnings("unchecked") 
public <T> T getMap(Class<T> tClass) { 
    return (T) classObjectMap.get(tClass); 
} 

領域本身不提供檢查,因爲你不能定義在每個條目的基礎的關係。有了getter和setter,你可以確保類型是正確的,只要你使用那些能按預期工作的類型。


您選擇的類型是指你不能對他們添加。我會讓類型允許添加。您可以使用類型擦除來解決問題,但這並不理想。

我沒說不幹活。說我不知道​​如何建立其中將包含不同類型的對象(混合列表)名單

你可以有一個List<Object>其中可以包含任何對象。或者更簡單地只是List

無關混合類型的收集很少是一個好主意。它通常意味着您正在避免創建一個自定義類作爲您的DVO或DTO。

+0

什麼樣的類型? – Jim

+0

我不知道你的意思,你能澄清嗎? –

+0

如果我這樣做:'List >'我可以添加任何* SomeObject類型嗎? – Jim

0

您不能將對象添加到例如List,其通用類型爲通配符?

這是因爲編譯器無法檢查您要添加的對象是否允許實際類型的集合。例如:

// A List that should only contain strings 
List<?> list = new List<String>(); 

// This is not allowed, because the compiler only knows that 'list' 
// is a List<?>; so it can't be sure here that integers are allowed in the list 
list.add(123); 

用一個例子更詳細的解釋請參見安格朗格的Java泛型常見問題Which methods and fields are accessible/inaccessible through a reference variable of a wildcard parameterized type?

+0

但我知道這一點。這就是爲什麼我問如何解決我的問題 – Jim

+0

@Jim爲什麼你總是使用通配符,而不是給你的方法或類一個泛型類型參數'T'? – Jesper

+0

因爲它們可能在地圖上有不同類型 – Jim

0

basicly你可以做到這一點,但小動作 - 因爲你知道鍵和值的大小,你可以使用「指定者」上map.keys()方法和map.values()。這會給你2個陣列

class Key<T> { 
    } 
    Map<Key<?>, ?> map = new HashMap<Key<?>, Object>(); 
    Key[] keyz = map.keySet().toArray(new Key[0]); 
    Object[] values = map.values().toArray(new Object[0]); 
    List<Key<?>> lstKey = Arrays.<Key<?>>asList(keyz); 
    List<?> lstVal = Arrays.asList(values); 

Java中的數組是協變的,這使得它成爲可能。