建立泛型陣列非法的原因

2021-07-10 11:25:00 字數 1005 閱讀 4019

list stringlists = new list[1];

listintlist = arrays.aslist(42);

object objects = stringlists;

objects[0] = intlist;

string s = stringlist[0].get(0);

首先假設泛型陣列合法,則第一行不會出現編譯錯誤;

第一行和第二行都很容易理解,現在看第三行,可以看出這出現了多型,編譯時objects是object型別,執行時是list 型別;

第四行裡,編譯的時候,將乙個list型別的引用賦給object是沒有問題的,因為泛型也是object物件。而對於執行時,objects的型別是list,

同時因為泛型在執行時會進行擦除(list變成list,list 變成list),所以第四行可以看成是將乙個list物件賦給乙個list物件,所以執行時也不會出現問題;

現在看第五行,由於list物件呼叫get(int i)返回的是e,所以list.get(0)返回的是string並賦給string,所以編譯時不會有錯誤。

但執行時get()返回的是乙個integer,將它賦給string就會出現classcastexception;

泛型保證編譯不出錯就不會執行時出錯,而泛型陣列打破了這種諾言,所以泛型陣列不合法;

可能有人會說,上面的**為什麼不寫成下面這種,為什麼要宣告乙個object:

list stringlists = new list[1];

listintlist = arrays.aslist(42);

stringlists[0] = intlist;

string s = stringlist[0].get(0);

要是這樣的話,編譯時在第三行處就會因為將乙個list賦給乙個list出現編譯錯誤,這樣就通過編譯了;

所以可以看出,object的存在就是為了利用多型的性質使得將乙個list賦給乙個list成功。

泛型建立型別陣列

方法一 建立乙個顯式的工廠物件,獲得編譯檢查。package com.cognizant.ch15 inte ce factoryi class foo2 class intege ctory implements factoryi class widget public class factory...

C 泛型 建立泛型類 例子

public class linkedlistnode public t value public linkedlistnodenext public linkedlistnodeprev public class linkedlist ienumberable public linkedlistn...

泛型陣列的排序

下面給出部分 描述出如何對泛型陣列排序 定義結構體變數 public struct workdata 陣列宣告 red convert.toint32 txtred.text.trim blue convert.toint32 txtblue.text.trim yellow convert.toi...