6 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
我想糾正這個(gè):
但是當(dāng)我使用泛型時(shí),我有多種數(shù)據(jù)類型
泛型需要同質(zhì)的數(shù)據(jù)類型。例如, aList<Integer>
是一個(gè)只能容納 an 的列表Integer
,而 aList<? extends Number>
只能容納Number
s,它涵蓋了其他數(shù)字類型,如Long
、Short
、等……但由單一類型Double
引用。Number
無(wú)論如何,您正在尋找的是一個(gè) Bag - 一個(gè)可以容納任意對(duì)象的集合。您可以使用 anObject[]
或 a來(lái)實(shí)現(xiàn)這一點(diǎn)List<Object>
,并且當(dāng)您想要使用它時(shí),您必須檢查提取的每個(gè)元素的類型,因?yàn)樵?Java 中沒(méi)有辦法擁有異構(gòu)數(shù)據(jù)類型,這就是您所需要的。正在尋找。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
在我看來(lái),數(shù)組不太適合解決這個(gè)問(wèn)題,你應(yīng)該使用對(duì)象。
這不是對(duì)你的問(wèn)題的直接答案,而是以重新設(shè)計(jì)的形式給出的答案。
首先,讓我們解決您關(guān)于泛型和數(shù)組的陳述。數(shù)組是協(xié)變的并且保留的,而泛型是不變的并且被刪除的。
協(xié)變意味著什么時(shí)候
B extends A
,就可以 Write?A[] aArray = new B[someSize];
。不變意味著這是不可能的:ArrayList<A> aList = new ArrayList<B>();
將導(dǎo)致編譯時(shí)錯(cuò)誤。保留意味著有關(guān)類型的信息在運(yùn)行時(shí)保留:數(shù)組總是“知道*其元素的類型。擦除意味著編譯后類型信息消失。這也稱為類型擦除。
協(xié)變和保留與不變和擦除的混合很可能會(huì)給你帶來(lái)麻煩。ArrayList
這就是為什么使用 anObject[]
而不是 aT[]
作為其支持?jǐn)?shù)據(jù)結(jié)構(gòu)的原因。
現(xiàn)在到實(shí)際問(wèn)題。正如其他人已經(jīng)說(shuō)過(guò)的,我們可以沿著這條路創(chuàng)建一個(gè)Object[]
.?我強(qiáng)烈建議不要這樣做,因?yàn)槲覀儊G失了所有類型信息。取回該信息的唯一方法是檢查instanceof
,這會(huì)使您的代碼變得嚴(yán)格。想象一下您更改條目的類型。在這種情況下,instanceof
will 返回false
,可能會(huì)導(dǎo)致不需要的行為,并且(最好的情況)一些測(cè)試變成紅色,或者(最壞的情況)我們可能不會(huì)注意到它。
現(xiàn)在如何解決這個(gè)問(wèn)題?我們創(chuàng)建一個(gè)代表(我推斷的是)匹配結(jié)果的類:
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
}
我們贏得了什么?我們有類型。分?jǐn)?shù)始終為int
s,結(jié)果始終為String
s。例如,如果我們將getReultforFirstTeam()
from的類型更改String
為 an?Enum
,那么我們將在類型不再匹配的所有位置得到編譯器錯(cuò)誤。因此,我們磨練了快速失敗設(shè)計(jì),并被迫在必要時(shí)修改代碼。因此,我們甚至沒(méi)有機(jī)會(huì)再犯以前的那些偷偷摸摸的、不受歡迎的行為。

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
outcome?=?{7,?"Tie"?,?9.0};
根本不合法。
您只能使用此語(yǔ)法 -數(shù)組初始值設(shè)定項(xiàng),其中在等于之后省略元素類型 - 在變量聲明中,例如
Object[]?outcome?=?{7,?"Tie"?,?9.0};

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
處理此問(wèn)題的一種方法是創(chuàng)建一個(gè)Object可以容納所有數(shù)據(jù)類型的數(shù)組
Object[] outcome = {7, "Tie" , 9.0};
之后您可以訪問(wèn)如下對(duì)象:
if(outcome[0] instanceof Integer){
Integer i = (Integer) outcome[0];
}
反之亦然..

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
如前所述,您可以使用對(duì)象數(shù)組?;蛘?,您可以使用泛型類。這是一個(gè)例子:
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();
? ? }
}

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
您將必須創(chuàng)建一個(gè)對(duì)象數(shù)組,因?yàn)?java 中的所有對(duì)象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 處的對(duì)象是否是(例如),那么Integer您必須使用強(qiáng)制轉(zhuǎn)換:
int x = (Integer)arr[x]; //x could be 0 or 1 or 2
您也可以使用以下方法來(lái)做到這一點(diǎn)ArrayList:
List<Object> listObjects = new ArrayList<Objects>();
添加回答
舉報(bào)