Javagenerics中是否有联盟?

我可以在集合中包含两种不同的类型吗? 例如,我可以使用List 吗?

简短的回答? 不。您当然可以拥有一个Objects List ,但是您可以在其中放置任何内容,而不仅仅是StringInteger对象。

您可以创建容器对象列表,该容器对象将包含IntegerString (可能通过generics)。 更麻烦一点。

 public class Contained { T getContained(); } 

并实现ContainedContained

当然, 真正的问题是你为什么要这样做? 我希望集合包含相同类型的对象,然后我可以迭代并对这些对象执行操作,而不必担心它们是什么。 也许您的对象层次结构需要进一

不。 不过,您有几种选择:

  • 您可以使用List 并存储任何您喜欢的内容; 要么

  • 您可以使用List 并将您的数据放入其中一个类成员中。

编辑:示例。

 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 strings, List integers) { ... } } -------------------------------------- public class DataPair { public List strings; public List integers; } public class Algorithm2 { public void process(DataPair dataPair) { ... } } 

不。想一想:通过generics,整个想法是提供类型安全。 如果您可以将不同类型的对象放入其中,那将是不可能的。

您可以使用非genericsjava.util.List来实现。

如果要确保只有StringInteger对象进入列表,您可以创建自己的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 factory = GenericUnions.doubletFactory(); Union2 strElem = factory.first("hello"); Union2 intElem = factory.second(3); List> list = Array.asList(strElem, intElem); for (Union2 elem : list) { elem.continued( strElem -> System.out.println("string: " + strElem), intElem -> System.out.println("integer: " + intElem)); } 

没有测试过这个,但我认为你有了这个想法。