2011-12-13 25 views
2

今天我已經寫有關聲明陣列的語法簡單的測試,因此,有3類:Java數組宣言如{A [] AA =新B [10]}

public class A { 
} 

public class B extends A { 
} 

public class C extends A { 
} 

,我已經嘗試使用下一個語法

A[] aa = new B[10]; 

所以,它可以創建數組,但我們可以添加只是B類的實例,這個數組,如果你嘗試添加的A實例或C收到java.lang.ArrayStoreException和問題,爲什麼我們可以使用類似的語法創建數組那它在哪裏可以使用並賺取一些利潤? 謝謝。

回答

3

語言允許使用該語法的原因是,有時您不關心數組中的對象的子類。該Java Language Specification rules爲陣列子類型包括:

如果小號Ť都引用類型,然後 S []> T [] IFF 小號> T

(其中> 表示「直接子類型」)。

這可以寫出這樣的方法:

public void printArray(Object[] array) { 
    System.out.print('['); 
    boolean first = true; 
    for (Object obj : array) { 
     if (!first) { 
      System.out.print(", "); 
     } else { 
      first = false; 
     } 
     System.out.print(String.valueOf(obj)); 
    } 
    System.out.print(']'); 
} 

,然後用調用它:

String[] foo = { "a", "b", "c" }; 
printArray(foo); 

這種語言功能確實有推遲ArrayStoreException信息問題,運行時的不幸影響。

+0

謝謝,是的,這只是我發明的一種使用方式。 –

4

該數組保存類型Bs。儘管參考aa可以保存A [],B []或C []類型的數組(因爲C和B都擴展A),所以在運行時,數組只能保存Bs。

A類不是B.C類不是B.因此運行時異常。

編輯:

有像這樣的代碼許多潛在的用途。例如,您可以像這樣聲明一個數組,因爲直到運行時纔可能知道正在使用的更明確的類型。

例如:

Animal[] animals; 
if (useDogs) { 
animals = new Dog[num]; 
} else { 
animals = new Cat[num]; 
} 

loadIntoCar(animals); 
+0

在我的問題的答案,我完全理解發生了什麼,但爲什麼我們可以聲明這樣的數組? –

+0

我曾考慮過這種情況,但認爲這是架構問題,我是關於您的編輯 –

0

陣列類型是covariant,這意味着可以聲明A [] A =新B [](類別,與此相反,不:不能聲明列表<甲> a =新列表<B>())。

這就是爲什麼編譯器不能搶先檢查你將只在數組中放入有效類型的元素,這就解釋了爲什麼檢查只發生在運行時,當你嘗試向數組中插入一個元素時。

0

如果你想要的例子,看看Arrays。如果Java不允許數組多態性,那麼我們不能擁有諸如sort(Object[] a),toString(Object[] a),binarySearch(Object[] a, Object key)等的功能。請記住,BCObject的子類型,因此您可以對它們全部使用該功能。請注意,數組早於泛型(Java 1.5.0),並且即使是泛型也存在缺陷(對Java的權衡是因爲類型擦除,您無法在運行時知道泛型類型)。

相關問題