Javagenerics中是否有联盟?
我可以在集合中包含两种不同的类型吗? 例如,我可以使用List 吗?
简短的回答? 不。您当然可以拥有一个Objects
List
,但是您可以在其中放置任何内容,而不仅仅是String
或Integer
对象。
您可以创建容器对象列表,该容器对象将包含Integer
或String
(可能通过generics)。 更麻烦一点。
public class Contained { T getContained(); }
并实现Contained
和Contained
。
当然, 真正的问题是你为什么要这样做? 我希望集合包含相同类型的对象,然后我可以迭代并对这些对象执行操作,而不必担心它们是什么。 也许您的对象层次结构需要进一
不。 不过,您有几种选择:
-
您可以使用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
来实现。
如果要确保只有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 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)); }
没有测试过这个,但我认为你有了这个想法。