如何添加到无界列表? (泛型)

时间:2012-09-17 08:27:00

标签: java generics hashmap

我有兴趣做以下事项:
建立一个Map<SomeObject<?>, ?>。我想用2个列表来添加键和值:

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

但我不知道如何在此列表中添加对象。任何想法?
这是使用@Ivan idea

this的延续

3 个答案:

答案 0 :(得分: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那样创建自定义类。

答案 1 :(得分: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);

请参阅Angelika Langer的Java Generics常见问题解答中的Which methods and fields are accessible/inaccessible through a reference variable of a wildcard parameterized type?,以获得更详细的解释。

答案 2 :(得分:0)

基本上你可以这样做,但只需要一点点技巧 - 因为你知道键和值的大小,你可以在map.keys()和map.values()上使用“toArray”方法。这将为您提供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中的数组是协变的,这使得它成为可能。