你会如何创建一个混合布尔和字符的数组列表?
在使用ArrayList时,我有点新鲜。 我知道如何用字符串创建一个ArrayList,我知道如何用Integers创建一个。 我想知道,我如何创建一个包含两种类型的ArrayList,例如Doubles和Chars(但没有别的)。
这就是我所拥有的,
ArrayList DCList = new ArrayList();
显然它不是有效的Java代码,所以我的问题是,我该如何正确表达它?
以下是您的一些事实:
-
您不能将原始值放在Collection中(generics类型只能绑定到引用类型)
-
如果你需要同时放入
char
和double
(或者考虑上述点的Characters
和Doubles
),你需要声明列表包含Character
和Double
的最不常见的子类型,即Object
:List
但是,这不会禁止字符串和整数。
-
以下是我将如何解决它:
class MyDatatype { .... } class MyDatatypeCharVariant extends MyDatatype { char data; ... } class MyDatatypeDoubleVariant extends MyDatatype { double data; ... }
然后将列表声明为:
List
someList = new ArrayList ();
你不能在Arraylist
混合类型。 如果你需要不同的类型,你必须使用通用类型Object
。
ArrayList DCList = new ArrayList();
并且您不能在诸如int
或double
类的Arraylist中使用原始类型。 使用Integer
和Double
。
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)方法添加到自定义列表类来实现。