Java 如何创建布尔和字符混合的数组列表?

Java 如何创建布尔和字符混合的数组列表?,java,collections,Java,Collections,说到使用ArrayList,我是个新手。我知道如何用字符串创建ArrayList,我知道如何用整数创建ArrayList。我想知道,如何创建一个包含两种类型的ArrayList,例如double和Chars(但没有其他类型) 这就是我所拥有的 ArrayList<double && char> DCList = new ArrayList<double && char>(); ArrayList DCList=new ArrayList(

说到使用ArrayList,我是个新手。我知道如何用字符串创建ArrayList,我知道如何用整数创建ArrayList。我想知道,如何创建一个包含两种类型的ArrayList,例如double和Chars(但没有其他类型)

这就是我所拥有的

ArrayList<double && char> DCList = new ArrayList<double && char>();
ArrayList DCList=new ArrayList();
显然它不是有效的Java代码,所以我的问题是,如何正确地表达它

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

ArrayList<Pair<Double, Character>> DCList = new ArrayList<Pair<Double, Character>>();
然后就用

ArrayList<FooItem>
ArrayList

不能在
数组列表中混合类型。如果需要不同类型的对象,则必须使用通用类型
对象

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

并且不能在数组列表中使用基本类型,如
int
double
。使用
Integer
Double

以下是一些事实:

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

  • 如果您必须同时放置
    char
    s和
    double
    s(或者考虑到以上几点,
    Characters
    double
    ),则需要声明列表包含
    Character
    double
    的最不常见子类型,即
    对象

    List<Object> charsAndDoubles = new ArrayList<Object>();
    
    然后将列表声明为:

    List<MyDatatype> someList = new ArrayList<MyDatatype>();
    
    List-someList=new-ArrayList();
    
如何使用布尔和字符而不是字符串或整数创建数组列表

你不能使用静态输入。Java类型系统不允许这样做

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



Tom的答案是实现这一点的另一种方法,代价是为每个列表元素增加一个包装器对象。这避免了在提取时进行类型转换,但是您可以通过向自定义列表类添加getInt(pos)和getChar(pos)方法来实现这一点。

正如Mitch所说,这种语法不起作用,您可以创建一个名为other的泛型类型,我在过去曾多次使用过这种方法

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>>();
类{
左-左;
对对,;
公共或(左、左、右){
if(左!=null和右!=null){
抛出新的非法状态异常();
}
}
公共左getLeft(){
左转;
}
公共布尔值isLeft(){
返回左!=null;
}
公共权利{
返还权;
}
公共布尔值isRight(){
返回右侧!=null;
}
}
列表=新的ArrayList();

然而,这是一种非常罕见的正确方法。

1)语法不起作用,(2)在同一数组中存储不同类型通常是解决问题的错误方法……问题还不清楚(代码示例不是有效的Java)。您想要一个可以接受字符串或整数元素的列表吗?如果是这样的话,布尔和字符有什么特别之处?你能解释得更清楚一点吗?您希望列表包含什么内容?一些
boolean
s和另一些
char
s?你是如何做的,对于<代码>字符串 >和<代码> int >代码>?java(C++,C++,…)的类型系统太弱了,无法执行这个操作。你需要的是代数数据类型——比如Haskell和OCaml;我注意到这个问题可以用无数种不同的方式来理解。这不会禁止
Integer
Strings
…那么如何避免有人将MyDataType子类化并将其放入列表中呢?您可以声明子类型final,但不能声明超类型或接口。。。
List<MyDatatype> someList = new ArrayList<MyDatatype>();
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>>();