2012-12-20 38 views
4

Java中的Polymorphisim代表了通過覆蓋子類方法可以實現的許多形式。關於允許傳遞通用值的泛型,如ArrayList<Object>。這是多態概念的一部分嗎? Cheers關於多態性bevaviour

+0

我認爲這個鏈接可能包含有趣的信息給你:[多態可能沒有繼承](http://stackoverflow.com/a/11732581/697630)。它涵蓋了不同類型的多態,包括參數多態,這就是你在這裏討論的。 –

回答

3

泛型和多態性是兩個不同的東西。

泛型主要用於指定期望的類型。您可以使用通配符來定義一系列類型。例如。 <? extends List>可應用於任何類型的列表(LinkedList,ArrayList

多態性是一個對象可以有多種類型的概念。所以一個對象可以是List的一個實例,並且以ArrayList爲例。

例如,假設三類

public class Animal 

public class Dog extends Animal 

public class Cat extends Animal 

如果你有Dog一個實例,該對象既是DogAnimal

顯然,這兩個結合在一起的相當不錯,如果你定義一個ArrayList<Object>,那麼你可以將任何Object添加到列表(這是在Java中的任何類)在java中

2

Polymorphphism不能應用於泛型類型。 雖然String延伸ObjectArrayList<Object>不能用於指ArrayList<String>

Object obj = new String(); // OK 
ArrayList<Object> list = new ArrayList<String>(); // Not OK 
+0

許多人傾向於在面向對象編程模型方面考慮多態,但事實是多態是一個更廣泛的概念,而在其他編程範例中,它以不同的方式實現。在函數式編程語言如Haskell或SML中,參數多態性是關鍵。 Java泛型與它有許多相似之處。 –

3

多態性可以通過在Java兩種方式來實現。

  1. 靜態(超載 - 編譯時間)
  2. 動態(壓倒一切 - 運行時)

關於你的問題

是的,它可以通過在子類中重寫方法來完成。您也可以在重載和覆蓋的過程中爲參數創建對象。

1

使用對象進行多態性在Java中被認爲是不好的模式。它不會給你一個界面給你的保證和類型安全。

List<Object> animals = new ArrayList<Object>(); 
animals.add(new Sheep()); 
animals.add(new Cat()); 
// This will throw us an error! (ClassCastException) 
Cat cat = (Cat) animals.get(0) 

上面演示的錯誤無法在編譯時捕獲,只會在運行時發生錯誤時引發。如果我們創建了一個Animal接口,我們可以完全避免這個錯誤。

interface Animal { 
    //other methods you need to hide through polymorphism 
    void sound(); 
} 
List<Animal> animals = new ArrayList<Animal>(); 
// Sheep and Cat implement the Animal interface 
animals.add(new Sheep()); 
animals.add(new Cat()); 
// No error 
Animal animal = animals.get(0) 
// This will through a COMPILE TIME error 
Cat cat = animal.get(1); 

這顯示了試圖將實現多態更好的辦法,我們已經創建了一個更安全的方式時,可以在編譯時不能在運行時進行檢查。儘可能避免使用Object,可能會有更好的界面供您設計或使用。