在Java中,如何将基类转换为扩展/子类?

时间:2017-05-29 12:21:13

标签: java class

我宣布了一个扩展 B2BProductData 的新类 ProductWithCustomTags

public class ProductWithCustomTags extends B2BProductData {
        private static final long serialVersionUID = 1L;
        public Boolean useMapPriceOtherwiseMEPrice;
        public String category03;
        public String category02;
        public String category01;
    }

现在我的问题是我想将 B2BProductData 变量的实例强制转换为类 ProductWithCustomTags ,但它会返回异常。我怎样才能完成将基类转换为子类,扩展类属性最初为 null

我尝试以这种方式直接投射它,没有构建错误但产生异常:

B2BProductData productDataBaseClass = getProduct(); // Product getter, ASSUME IT RETURNS AN INSTANCE ALL THE TIME
ProductWithCustomTags derivedObject = (ProductWithCustomTags) productDataBaseClass;

假设getProduct()始终返回实例。我没有详细说明getter代码,因为它不是焦点。

2 个答案:

答案 0 :(得分:1)

除非基类的变量引用了您希望转换的子类的正确实例,否则不能将基类强制转换为子类。

在您的情况下,您获得的对象似乎是基类或除ProductWithCustomTags之外的其中一个子类。在这种情况下,最好包装基类的对象,而不是继承它:

public class ProductWithCustomTags {
    private static final long serialVersionUID = 1L;
    private final B2BProductData productData;
    public Boolean useMapPriceOtherwiseMEPrice;
    public String category03;
    public String category02;
    public String category01;
    public ProductWithCustomTags(B2BProductData d) {
        productData = d;
    }
    public B2BProductData getProductData() {
        return productData;
    }
}

按如下方式使用:

ProductWithCustomTags derivedObject = new ProductWithCustomTags(getProduct());

答案 1 :(得分:-1)

你可能误解了什么是铸造意味着什么。 Casting不会转换对象。一个物体不会发生变异。但在Java中,您通过引用操作对象,并且键入引用,这意味着通过该引用只能看到对象的一部分(由引用类型定义的部分)。现在,如果您知道后面的对象是给定类型,那么您可以将类型的引用转换为另一种类型。当然,这仅在对象符合要求时才有效。

因此,如果Dog您可以限制性地将其视为Animal,则可以检索它:

class Animal {}
class Dog extends Animal {}

Animal a = new Dog(); // `a` is a Dog! viewed as an Animal
Dog d = (Dog)a; // Ok try to retrieve the dog behind the animal...

因此,如果您的getProduct()方法没有返回ProductWithCustomTags的实例,那么您就无法将其删除。