每当我尝试将BufferedImage(父级)强制转换为我自己扩展的AdvancedBufferedImage(child)时,我得到ClassCastException
,我没有覆盖任何方法我'strong 实施了所有承包商而不修改它们
每当我尝试使用ImageIO.read()方法从File创建AdvancedBufferedImage时,我都会遇到此异常。
File file = new file(path);
AdvancedBufferedImage image = (AdvancedBufferedImage) ImageIO.read(file);
似乎应该没有任何问题,可能是什么问题?
答案 0 :(得分:15)
不允许这样的向下倾斜。
首选解决方案是创建AdvancedBufferedImage的构造函数,将BufferedImage作为参数。有了这个,你可以做到以下几点。
File file = new file(path);
AdvancedBufferedImage image = new AdvancedBufferedImage(ImageIO.read(file));
这里AdvancedBufferedImage的构造函数可以决定如何在高级函数中正确转换BufferedImage。
答案 1 :(得分:4)
除非PARENT类的引用包含CHILD类或其派生类的实例,否则不能将PARENT类强制转换为CHILD类。
在您的情况下,ImageIO.read(file)
返回BufferedImage
的实例,它是基类。只有当ImageIO.read(file)
返回AdvancedBufferedImage
或其子类的实例时,这才有效。
当你扩展某个类时,派生类从基类继承了一些属性,但是,基类什么都没有获得。因此,由于派生类的实例具有基类的所有属性,因此基类的引用可以包含派生类的实例,即您可以将DERIVED类转换为BASE类。现在,派生类可能会添加一些新属性,基类永远不会知道这些属性。因此,从BASE类到DERIVED的转换显然是不正确的。
答案 2 :(得分:3)
向下倾斜不会像这样工作。请参阅上面的帖子中的答案。作为替代方法,如何创建一个静态工厂方法,该方法接受BufferedImage
并返回使用ImageIO.read()
返回的对象构建的类的实例?
例如:
private AdvancedBufferedImage(BufferedImage bi) {
// build your AdvancedBufferedImage from bi
...
}
public static AdvancedBufferedImage buildABI(BufferedImage bi) {
return new AdvancedBufferedImage(bi)
答案 3 :(得分:2)
通常,您不能将父类转换为子类。 就像强迫将动物施放给狗一样。狗是一种动物,但另一种方式并非总是如此,因此Java编译器不允许你这样做。
答案 4 :(得分:2)
允许转发,但它必须是孩子的实际实例:
class A {
String name = "a";
A(){};
}
class B extends A {
}
public class Main {
public static void main(String[] args) {
A a = new B(); // must a b instance
B b = new B();
b = (B)a;
System.out.println(b.name);
}
}
答案 5 :(得分:0)
BufferedImage
不是 AdvancedBufferedImage
,因此广告系列失败。
您可以扩展BufferedImage
的功能,但read
方法仍然只返回BufferedImage
。转换不会强制引用变为或表现为所需类型。
您可能希望在BufferedImage
课程中包含AdvancedBufferedImage
,然后您可以传递并操纵您的高级课程。
答案 6 :(得分:-1)
如果您尝试投射的对象实际上是您要投射到的类的实例,那么您的向下投射将会成功。