2016-11-11 200 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; 
} 
}