我有兴趣做以下事情:
构建一个Map<SomeObject<?>, ?>
. 我想使用 2 个列表来添加键和值:
List<SomeObject<?>> keys;
List<?> values;
但我不知道如何在这个列表中添加对象。有任何想法吗?这
是使用@Ivan 想法的延续
每个条目可以不同,但键值对必须相同 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 一样创建自定义类。
例如,您不能将对象添加到其泛型类型List
具有通配符的 a 中。?
这是因为编译器无法检查您添加的对象是否允许用于集合的实际类型。例如:
// 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 泛型常见问题解答中,通过示例获得更长的解释。
基本上你可以做到这一点,但有一点技巧 - 因为你知道键和值的大小,你可以在 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中的数组是协变的,这使得它成为可能。