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

时间:2012-03-11 07:39:18

标签: java collections

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

这就是我所拥有的,

ArrayList<double && char> DCList = new ArrayList<double && char>();

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

5 个答案:

答案 0 :(得分:6)

以下是您的一些事实:

  • 您不能将原始值放入集合中(泛型类型只能绑定到引用类型)

  • 如果您需要同时考虑上述各点chardouble(或CharactersDoubles),您需要申报包含CharacterDouble的最不常见子类型的列表Object

    List<Object> charsAndDoubles = new ArrayList<Object>();
    

    然而不会禁止字符串和整数。

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

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

    然后将列表声明为:

    List<MyDatatype> someList = new ArrayList<MyDatatype>();
    

答案 1 :(得分:1)

您无法在Arraylist中混合使用类型。如果您需要不同的类型,则必须使用通用类型Object

ArrayList<Object> DCList = new ArrayList<Object>();

你不能在像intdouble这样的Arraylist中使用原始类型。使用IntegerDouble

答案 2 :(得分:0)

public class Pair<T1, T2> {
  ...
}

ArrayList<Pair<Double, Character>> DCList = new ArrayList<Pair<Double, Character>>();

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

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

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

然后只需使用

ArrayList<FooItem>

答案 3 :(得分:0)

  

如何使用布尔值和字符创建数组列表,而不是字符串或整数?

使用静态类型无法做到这一点。 Java类型系统不允许它。

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


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

答案 4 :(得分:0)

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

class Either<LEFT,RIGHT> {
    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<Either<Double,Char>> list = new ArrayList<Either<Double,Char>>();

尽管这是正确的做法,但这种情况非常罕见。