为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2023-06-28 15:41:56
我正在研究 Java 数组,此外,我正在研究泛型。下面是初始化数组的两种方法int[] data = {1,2,3,4,5,6,7,8,9};// orint[] 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来做吗?
查看完整描述

6 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我想纠正这个:

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

泛型需要同质的数据类型。例如, aList<Integer>是一个只能容纳 an 的列表Integer,而 aList<? extends Number>只能容纳Numbers,它涵盖了其他数字类型,如LongShort、等……但由单一类型Double引用。Number

无论如何,您正在寻找的是一个 Bag - 一个可以容纳任意对象的集合。您可以使用 anObject[]或 a来实现这一点List<Object>,并且当您想要使用它时,您必须检查提取的每个元素的类型,因为在 Java 中没有办法拥有异构数据类型,这就是您所需要的。正在寻找。


查看完整回答
反对 回复 2023-06-28
?
动漫人物

TA贡献1815条经验 获得超10个赞

在我看来,数组不太适合解决这个问题,你应该使用对象。


这不是对你的问题的直接答案,而是以重新设计的形式给出的答案。

首先,让我们解决您关于泛型和数组的陈述。数组是协变的并且保留的,而泛型是不变的并且被删除的。

  • 协变意味着什么时候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,那么我们将在类型不再匹配的所有位置得到编译器错误。因此,我们磨练了快速失败设计,并被迫在必要时修改代码。因此,我们甚至没有机会再犯以前的那些偷偷摸摸的、不受欢迎的行为。



查看完整回答
反对 回复 2023-06-28
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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

根本不合法。

您只能使用此语法 -数组初始值设定项,其中在等于之后省略元素类型 - 在变量声明中,例如

Object[] outcome = {7, "Tie" , 9.0};


查看完整回答
反对 回复 2023-06-28
?
郎朗坤

TA贡献1921条经验 获得超9个赞

处理此问题的一种方法是创建一个Object可以容纳所有数据类型的数组


Object[] outcome = {7, "Tie" , 9.0};

之后您可以访问如下对象:


if(outcome[0] instanceof Integer){

   Integer i = (Integer) outcome[0];

}

反之亦然..


查看完整回答
反对 回复 2023-06-28
?
函数式编程

TA贡献1807条经验 获得超9个赞

如前所述,您可以使用对象数组。或者,您可以使用泛型类。这是一个例子:


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();

    }

}



查看完整回答
反对 回复 2023-06-28
?
呼唤远方

TA贡献1856条经验 获得超11个赞

您将必须创建一个对象数组,因为 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>();


查看完整回答
反对 回复 2023-06-28
  • 6 回答
  • 0 关注
  • 281 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信