Java泛型中是否有联盟?

问题描述 投票:5回答:5

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

java generics
5个回答
5
投票

简短的回答?你可以(当然)有ListObjects,但是你可以把任何东西放进去,而不仅仅是StringInteger物品。

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

public class Contained<T> {
   T getContained();
}

并实施Contained<Integer>Contained<String>

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


2
投票

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

  • 您可以使用List <Object>并存储任何您喜欢的内容;要么
  • 您可以使用List <Class-with-2-members>并将您的数据放入其中一个类成员中。

编辑:示例。

class UnionHolder {
  public String stringValue;
  public int intValue;
}

List < UnionHolder > myList 
...

当然,您需要一些额外的代码来确定从列表中获取的UnionHolder对象中提取哪种数据。一种可能性是让第三个成员具有不同的值,具体取决于它是什么,或者你可以说,有一个成员函数,如

public boolean isItAString() { return (this.stringValue != null }

1
投票

除了已经提供的好答案......


可能您的算法中有两种数据类型。但你可能不必把它们放在同一个列表中......

创建两个类型列表可能会使您的算法更清晰,您仍然可以保持“类型安全”并携带所有数据。随后是两个代码示例,第二个对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) {
   ...
 }

}

0
投票

不这么想。用泛型,整个想法是提供类型安全。如果您可以将不同类型的对象放入其中,那将是不可能的。

您可以将非通用java.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界面的清晰度......


0
投票

如果您正在使用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));
}

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

© www.soinside.com 2019 - 2024. All rights reserved.