我可以在集合中包含两种不同的类型吗?例如,我可以使用List <String U Integer>吗?
简短的回答?你可以(当然)有List
的Objects
,但是你可以把任何东西放进去,而不仅仅是String
或Integer
物品。
您可以创建容器对象列表,该容器对象将包含Integer
或String
(可能通过泛型)。更麻烦一点。
public class Contained<T> {
T getContained();
}
并实施Contained<Integer>
和Contained<String>
。
当然,真正的问题是你为什么要这样做?我希望集合包含相同类型的对象,然后我可以迭代并对这些对象执行操作,而不必担心它们是什么。也许您的对象层次结构还需要进一
不。不过,您有几种选择:
编辑:示例。
class UnionHolder {
public String stringValue;
public int intValue;
}
List < UnionHolder > myList
...
当然,您需要一些额外的代码来确定从列表中获取的UnionHolder对象中提取哪种数据。一种可能性是让第三个成员具有不同的值,具体取决于它是什么,或者你可以说,有一个成员函数,如
public boolean isItAString() { return (this.stringValue != null }
除了已经提供的好答案......
可能您的算法中有两种数据类型。但你可能不必把它们放在同一个列表中......
创建两个类型列表可能会使您的算法更清晰,您仍然可以保持“类型安全”并携带所有数据。随后是两个代码示例,第二个对MyData对象中的两个列表进行分组。
public class Algorithm1 {
public void process(List<String> strings, List<Integer> integers) {
...
}
}
--------------------------------------
public class DataPair {
public List<String> strings;
public List<Integer> integers;
}
public class Algorithm2 {
public void process(DataPair dataPair) {
...
}
}
不这么想。用泛型,整个想法是提供类型安全。如果您可以将不同类型的对象放入其中,那将是不可能的。
您可以将非通用java.util.List
用于您的目的。
如果您想确保只有String
或Integer
对象进入列表,您可以创建自己的List实现,如下所示:
public class MySpecialList {
private List list= new LinkedList();
...
public void add(final String string) {
list.add(string);
}
public void add(final Integer integer) {
list.add(integer);
}
...
// add rest of List style methods
}
缺点:你松开了List
界面的清晰度......
如果您正在使用Java 8或更高版本中的函数式编程,您可能需要尝试JavaSealedUnions:
Union2.Factory<String, Integer> factory = GenericUnions.doubletFactory();
Union2<String, Integer> strElem = factory.first("hello");
Union2<String, Integer> intElem = factory.second(3);
List<Union2<String, Integer>> list = Array.asList(strElem, intElem);
for (Union2<String, Integer> elem : list) {
elem.continued(
strElem -> System.out.println("string: " + strElem),
intElem -> System.out.println("integer: " + intElem));
}
没有测试过这个,但我认为你有了这个想法。