亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用混合數據類型在泛型中初始化數組

如何使用混合數據類型在泛型中初始化數組

慕勒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,它涵蓋了其他數字類型,如Long、Short、等……但由單一類型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 關注
  • 366 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號