猿问

如何使用混合数据类型在泛型中初始化数组

我正在研究 Java 数组,此外,我正在研究泛型。下面是初始化数组的两种方法


int[] data = {1,2,3,4,5,6,7,8,9};


// or


int[] data;

data = new int[] {1,2,3,4,5,6,7,8,9};

但是当我使用泛型时,我有多种数据类型,例如,


String[] outcome = {"0 wins", "Tie" , "X wins"};

上面的数组有一个字符串数据类型。如果在数组中我有类似下面的内容怎么办


outcome = {7, "Tie" , 9.0};

现在我在数组中混合了多种数据类型。我该如何编写它或者是否可以使用泛型?我可以用ArrayList来做吗?


慕勒3428872
浏览 282回答 6
6回答

天涯尽头无女友

我想纠正这个:但是当我使用泛型时,我有多种数据类型泛型需要同质的数据类型。例如, aList<Integer>是一个只能容纳 an 的列表Integer,而 aList<? extends Number>只能容纳Numbers,它涵盖了其他数字类型,如Long、Short、等……但由单一类型Double引用。Number无论如何,您正在寻找的是一个 Bag - 一个可以容纳任意对象的集合。您可以使用 anObject[]或 a来实现这一点List<Object>,并且当您想要使用它时,您必须检查提取的每个元素的类型,因为在 Java 中没有办法拥有异构数据类型,这就是您所需要的。正在寻找。

动漫人物

在我看来,数组不太适合解决这个问题,你应该使用对象。这不是对你的问题的直接答案,而是以重新设计的形式给出的答案。首先,让我们解决您关于泛型和数组的陈述。数组是协变的并且保留的,而泛型是不变的并且被删除的。协变意味着什么时候B extends A,就可以 Write A[] aArray = new B[someSize];。不变意味着这是不可能的:ArrayList<A> aList = new ArrayList<B>();将导致编译时错误。保留意味着有关类型的信息在运行时保留:数组总是“知道*其元素的类型。擦除意味着编译后类型信息消失。这也称为类型擦除。协变和保留与不变和擦除的混合很可能会给你带来麻烦。ArrayList这就是为什么使用 anObject[]而不是 aT[]作为其支持数据结构的原因。现在到实际问题。正如其他人已经说过的,我们可以沿着这条路创建一个Object[]. 我强烈建议不要这样做,因为我们丢失了所有类型信息。取回该信息的唯一方法是检查instanceof,这会使您的代码变得严格。想象一下您更改条目的类型。在这种情况下,instanceofwill 返回false,可能会导致不需要的行为,并且(最好的情况)一些测试变成红色,或者(最坏的情况)我们可能不会注意到它。现在如何解决这个问题?我们创建一个代表(我推断的是)匹配结果的类:public class MatchResult {    private final int firstTeamScore;    private final int secondTeamScore;    public MatchResult(final int firstTeamScore, final int secondTeamScore) {        this.firstTeamScore = firstTeamScore;        this.secondTeamScore = secondTeamScore;    }    public int getFirstTeamScore() {        return firstTeamScore;    }    public int getSecondTeamScore() {        return secondTeamScore;    }    public String getResultForFirstTeam() {        if (firstTeamScore > secondTeamScore) {            return "Win"; // In an actual implementation, I would replace this with an enum        } else if(firstTeamScore = secondTeamScore) {            return "Tie";        } else {           return "Lose";        }    }    // You can add a method public String getResultForSecondTeam(), I omitted it for brevity}我们赢得了什么?我们有类型。分数始终为ints,结果始终为Strings。例如,如果我们将getReultforFirstTeam()from的类型更改String为 an Enum,那么我们将在类型不再匹配的所有位置得到编译器错误。因此,我们磨练了快速失败设计,并被迫在必要时修改代码。因此,我们甚至没有机会再犯以前的那些偷偷摸摸的、不受欢迎的行为。

慕码人8056858

outcome = {7, "Tie" , 9.0};根本不合法。您只能使用此语法 -数组初始值设定项,其中在等于之后省略元素类型 - 在变量声明中,例如Object[] outcome = {7, "Tie" , 9.0};

郎朗坤

处理此问题的一种方法是创建一个Object可以容纳所有数据类型的数组Object[] outcome = {7, "Tie" , 9.0};之后您可以访问如下对象:if(outcome[0] instanceof Integer){&nbsp; &nbsp;Integer i = (Integer) outcome[0];}反之亦然..

函数式编程

如前所述,您可以使用对象数组。或者,您可以使用泛型类。这是一个例子:public class Queue<E> {    private ArrayList<E> queue;    /**Unparametrized constructor**/    public Queue() {        queue = new ArrayList<E>();    }    /**Enqueues an element into the queue.**/    public void enqueue(E val) {        queue.add(val);    }    /**Dequeues an element from the queue.**/    public E dequeue() {        E output = queue.get(0);        queue.remove(0);        return output;    }    /**Gets the current size of the queue.**/    public int size() {        return queue.size();    }}

呼唤远方

您将必须创建一个对象数组,因为 java 中的所有对象extends Object:Object[] arr = new Object[3];//to add objects to it:arr[0]=new String("element at index 0");arr[1]=new Integer(1);arr[2]=new Character('2');要查找索引 x 处的对象是否是(例如),那么Integer您必须使用强制转换:int x = (Integer)arr[x]; //x could be 0 or 1 or 2您也可以使用以下方法来做到这一点ArrayList:List<Object> listObjects = new ArrayList<Objects>();
随时随地看视频慕课网APP

相关分类

Java
我要回答