簡體   English   中英

為什么Array元素必須屬於同一類型

[英]Why does Array elements have to be of the same type

Array DS要求其所有成員具有相同的時間。 當嘗試將錯誤類型的對象存儲到對象數組中時,Java會拋出ArrayStoreException 不記得C++作用。

我的理解是正確的 ,在數組中包含相同類型的所有對象很重要, 因為它通過以下兩個操作保證了恆定的時間元素訪問:

1) element size * element index = offset
2) array pointer address + offset

如果物體具有不同的類型並因此具有不同的尺寸,則上述公式將不起作用。

因為:我們想要這樣。

我的意思是:使用Java語言的人(可能與C ++相同)正在使用靜態類型語言。

當這些人開始以復數形式思考時; 他們通常會想到多個“相似”的東西。

警告:在Java中,一切都是一個Object,所以你總是可以聲明一個Object []並將任何東西都填入其中。 字符串,數字,等等。

這也導致了另一個重要方面:在C ++中,您的數組代表內存中的一個區域。 而且你最好在那個區域擁有相同大小的元素; 避免數據損壞。

另一方面,在Java中,數組指向原始內存。

簡而言之:在這種情況下,Java和C ++之間存在着真正的差異(人們必須明白這一點才能做出明智的決定); 然后就是“語言”本身。 換句話說:這不是紅寶石的土地,你只需將鴨子,數字,植物和嘎嘎的聲音放在同一個“列表”中,而無需進一步思考。

最后的想法,基於最后一段中的笑話:在我看來, 數組是列表概念的實現,因此它是關於同一性質的事物的集合。 如果你想要一組無關的東西,我寧願稱之為元組

是的,你是對的。 恆定時間隨機訪問所需的一切。

此外,如果要在單個數組中存儲不同的數據類型,則可以擁有一個void指針數組。 例如在c ++中,做

void * a[N]

a[i] = (void *)(&YourClass)

同樣,在java中使用Object[]

C ++語言(和編譯器)需要元素的類型出於各種原因存儲在數組中,如指針算術和數組預訂(例如x[i] ),元素的默認初始化,處理對齊限制,... )。

int x[3] = { 1,2,3 };  // array of 3 int values, each being properly aligned concerning processor architecture;
myObjectType objs[10]; // array of 10 objects of type myObjectType, each being default initialised (probably the default constructor), each being properly aligned
myObjectType *objs[10]; // array of 10 pointers to objects of type myObjectType (including subclasses of myObjectType; allowing dynamic binding and polymorphism). Note: all pointers have the same size, the object to which they point may differ insize.

int *intptr = x;
bool isEqual= (intptr[2] == x[2]); // gives true
intptr += 2; // increases the pointer by "2*sizeof(int)" bytes.

所以,是的,你是對的:一個原因是因為計算偏移量; 但是還有其他原因,其他問題如對齊,數組到指針衰減,默認初始化邏輯也可能更微妙但也很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM