我宣布了一个扩展 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代码,因为它不是焦点。
答案 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
的实例,那么您就无法将其删除。