2016-11-11 223 views
2

我想澄清這一點,所以我完全理解類型鑄造。請糾正任何不正確的事情,因爲我現在以非常緩慢的速度自學了大約2個月的Java。在Java中的類型鑄造/鑄造

比方說,我創建了一個名爲SubObject的類。我知道所有沒有直接顯式超類的類都被假定爲Object類的子類。

Object obj1 = new SubObject(); 
    SubObject subObj1 = (SubObject) obj1; 
    System.out.println(subObj1); //prints out com.examplePackage.SubObject1234e1234; 

因此,我已經成功地將基類(Object)的引用降級到其派生類(subObject)。然而...

Object obj2 = new Object(); 
SubObject subObj2 = (SubObject) obj2;//this throws the ClassCastException error. 

我ClassCastException異常錯誤的理解是,它繼承的RuntimeException在編譯時抓住它,就表明該代碼試圖將對象強制轉換的子類時它不是一個實例。因爲subObj2不是SubObject的實例,而是Object,所以它不兼容。

所以我有兩個問題: 1.我的理解中是否有任何缺陷/錯誤? 2.在哪種情況下實際使用了向下轉換?感謝大家的幫助。

回答

1

RuntimeException的相關性是它'unchecked'。所以開發人員不會被迫去處理它。通常的做法是檢查(使用if聲明並使用諸如instanceOf之類的內容)以查看在允許演員表演之前演員是否被允許。

所以,

if(subObj2 instanceof SubObject) { 
    SubObject s2 = (SubObject) obj2; 
    ... 
} 

然而,這被認爲是一個「代碼味道」 - 即的東西,是不尋常的,並且在環的高級開發人員心目中警鐘。一般來說,你應該通過多態來實現這種事情,儘管這並不總是可行或可取的。對於大多數類型的程序,大多數時候不需要類型轉換。

但是,你的想法是大致正確的。

0

下行可能發生的情況是在工廠設計模式的背景下。在這種設計模式中,多個子類的實現細節可以通過使用它們的父類來抽象。

請看下面的例子:

import java.util.ArrayList; 

public class Factory { 

private ArrayList<Product> products = new ArrayList<Product>(); 

public static void main(String[] args){ 
    Factory factory = new Factory(); 

    factory.addProduct(new Ball("1")); 
    factory.addProduct(new ToyCar("2")); 
    factory.addProduct(new Dice("3")); 

    Product popProduct = factory.popProduct(); 

    Ball downcastBall = (Ball)popProduct; 

    System.out.println(downcastBall.getId()); 
} 

public void addProduct(Product prodIn){ 
    products.add(prodIn); 
} 

public Product popProduct(){ 
    Product returnProd = products.get(0); 
    products.remove(0); 
    return returnProd; 
} 
} 

的類球,ToyCar和骰子所有擴展產品類,並實現它的getId()方法,所以三個孩子都可以被視爲只是產品。這被稱爲多態性。

我發佈代碼的其餘部分,以便您可以使用它。

的球類:

public class Ball extends Product{ 

public Ball(String id) { 
    super(id); 
} 

public String getId(){ 
    return "ball!"; 
} 
} 

的ToyCar類:

public class ToyCar extends Product{ 

private String ToyCarId; 

public ToyCar(String id) { 
    super(id); 

} 

public String getId(){ 
    return this.ToyCarId; 
} 
} 

骰子類:

public class Dice extends Product{ 

private String diceId; 

public Dice(String id) { 
    super(id); 

} 

public String getId(){ 
    return this.diceId; 
} 
} 

最後的產品類別:

public class Product { 

private String id; 

public Product(String id){ 
    this.id = id; 
} 

public String getId(){ 
    return this.id; 
} 
}