在Java中键入casting/Down casting

在Java中键入casting/Down casting,java,object,casting,downcast,Java,Object,Casting,Downcast,我试图澄清这一点,以便我完全理解类型转换。请纠正我的错误,因为我已经自学java大约2个月了,速度非常慢 假设我创建了一个名为SubObject的类。我知道所有没有直接显式超类的类都被假定为对象类的子类 Object obj1 = new SubObject(); SubObject subObj1 = (SubObject) obj1; System.out.println(subObj1); //prints out com.examplePackage.SubObject

我试图澄清这一点,以便我完全理解类型转换。请纠正我的错误,因为我已经自学java大约2个月了,速度非常慢

假设我创建了一个名为SubObject的类。我知道所有没有直接显式超类的类都被假定为对象类的子类

Object obj1 = new SubObject(); 
    SubObject subObj1 = (SubObject) obj1;
    System.out.println(subObj1); //prints out com.examplePackage.SubObject1234e1234;
因此,我成功地将基类(对象)的引用向下转换为其派生类(子对象)。然而

Object obj2 = new Object();
SubObject subObj2 = (SubObject) obj2;//this throws the ClassCastException error.
我对ClassCastException错误的理解是,它继承了RuntimeException,以便在编译时捕获它,从而表明代码试图将对象强制转换为它不是实例的子类。因为SubObject 2不是SubObject的实例,而是Object,所以它是不兼容的

所以我有两个问题: 1.我的理解有任何缺陷/错误吗?
2.在哪种情况下实际使用向下投射?谢谢大家的帮助。

RuntimeException的相关性就在于此。因此,开发人员不必被迫处理它。通常的方法是检查(使用
if
语句并使用
instanceOf
之类的语句)是否允许强制转换,然后再允许强制转换

所以

然而,这被认为是一种“代码气味”——即一些不同寻常的东西,在高级开发人员的头脑中敲响了警钟。一般来说,您应该通过多态性来实现这类事情,尽管这并不总是可能的或可取的。对于大多数类型的程序,大多数情况下不需要类型转换


但是,您的想法大体上是正确的。

在工厂设计模式的背景下,可能会出现向下投射的情况。在这个设计模式中,多个子类的实现细节可以通过使用它们的父类来抽象

考虑以下示例:

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类:

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;
}
}
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;
}
}