你会如何创建一个混合布尔和字符的数组列表?

在使用ArrayList时,我有点新鲜。 我知道如何用字符串创建一个ArrayList,我知道如何用Integers创建一个。 我想知道,我如何创建一个包含两种类型的ArrayList,例如Doubles和Chars(但没有别的)。

这就是我所拥有的,

ArrayList DCList = new ArrayList(); 

显然它不是有效的Java代码,所以我的问题是,我该如何正确表达它?

以下是您的一些事实:

  • 您不能将原始值放在Collection中(generics类型只能绑定到引用类型)

  • 如果你需要同时放入chardouble (或者考虑上述点的CharactersDoubles ),你需要声明列表包含CharacterDouble的最不常见的子类型,即Object

     List charsAndDoubles = new ArrayList(); 

    但是,这不会禁止字符串和整数。

  • 以下是我将如何解决它:

     class MyDatatype { .... } class MyDatatypeCharVariant extends MyDatatype { char data; ... } class MyDatatypeDoubleVariant extends MyDatatype { double data; ... } 

    然后将列表声明为:

     List someList = new ArrayList(); 

你不能在Arraylist混合类型。 如果你需要不同的类型,你必须使用通用类型Object

 ArrayList DCList = new ArrayList(); 

并且您不能在诸如intdouble类的Arraylist中使用原始类型。 使用IntegerDouble

 public class Pair { ... } ArrayList> DCList = new ArrayList>(); 

我将把Pair类的实现留给你。

在许多情况下,您可能拥有描述要存储的内容的类,即

 public class FooItem { private double doubleThing; private char charThing; public double getDoubleThing() { return doubleThing; } public char getCharThing() { return charThing; } ... } 

然后只是使用

 ArrayList 

正如Mitch所说,这种语法不起作用你可能会创建一个名为Either的generics类型,这在过去我已经使用了几次。

 class Either { LEFT left; RIGHT right; public Either(LEFT left, RIGHT right) { if (left != null && right != null) { throw new IllegalStateException(); } } public LEFT getLeft() { return left; } public boolean isLeft() { return left != null; } public RIGHT getRight() { return right; } public boolean isRight() { return right != null; } } List> list = new ArrayList>(); 

尽管如此,这是非常罕见的。

你将如何创建一个包含布尔和字符的数组列表,而不是字符串或整数?

你不能使用静态类型。 Java类型系统不允许它。

您可以做的最好的是实现一个List类,该类检查它放入列表的元素的类型。 (您可以扩展ArrayList并覆盖添加或修改列表元素的方法。)


Tom的答案是实现这一目标的另一种方法,代价是每个列表元素的额外包装器对象。 这样就无需在提取时进行类型转换,但您可以通过将getInt(pos)和getChar(pos)方法添加到自定义列表类来实现。