将父级转换为子级 - BufferedImage对象

时间:2012-08-03 15:37:28

标签: java casting bufferedimage

每当我尝试将BufferedImage(父级)强制转换为我自己扩展的AdvancedBufferedImage(child)时,我得到ClassCastException,我没有覆盖任何方法我'strong 实施了所有承包商而不修改它们

每当我尝试使用ImageIO.read()方法从File创建AdvancedBufferedImage时,我都会遇到此异常。

File file = new file(path);
AdvancedBufferedImage image = (AdvancedBufferedImage) ImageIO.read(file);

似乎应该没有任何问题,可能是什么问题?

7 个答案:

答案 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)

Downcasting in Java

向下倾斜不会像这样工作。请参阅上面的帖子中的答案。作为替代方法,如何创建一个静态工厂方法,该方法接受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编译器不允许你这样做。

请参阅object inheritance

答案 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)

如果您尝试投射的对象实际上是您要投射到的类的实例,那么您的向下投射将会成功。