6 回答

TA貢獻1831條經驗 獲得超9個贊
我想糾正這個:
但是當我使用泛型時,我有多種數據類型
泛型需要同質的數據類型。例如, aList<Integer>
是一個只能容納 an 的列表Integer
,而 aList<? extends Number>
只能容納Number
s,它涵蓋了其他數字類型,如Long
、Short
、等……但由單一類型Double
引用。Number
無論如何,您正在尋找的是一個 Bag - 一個可以容納任意對象的集合。您可以使用 anObject[]
或 a來實現這一點List<Object>
,并且當您想要使用它時,您必須檢查提取的每個元素的類型,因為在 Java 中沒有辦法擁有異構數據類型,這就是您所需要的。正在尋找。

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

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

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

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

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>();
添加回答
舉報