好吧,这可能是一个愚蠢的问题,但我对java有点生疏,所以……我扩展了Mat类,以便添加新的变量。它按预期工作,但当我尝试使用一个返回母类类型并将其分配给子类的方法时,如下所示:
Supermat Matchild; <-- (essentially the wrapper class i've made)
MatChild = (Supermat) imread(name);
它返回给我这个错误:
java.lang.ClassCastException: org.opencv.core.Mat cannot be cast to images.Supermat
有人能告诉我为什么会发生这种情况吗?如果有解决办法的话?
您的命名和代码风格令人困惑。即使是这两条线也很难理解。学习Java编码标准。
你说你做到了:
public class CustomMat extends Mat {
}
这意味着您可以在代码中调用Mat
的任何位置使用CustomMat
。
Mat mat = new CustomMat();
为什么这样做?因为CustomMat
IS-a Mat
;这就是继承的意义。
如果给你一个Mat
引用,并且你确定它指向一个CustomMat
实例,你可以强制转换它。但你已经失去了多态性的好处。这被称为"切片问题"。
我对OpenCV不太熟悉,但如果它像Java的其他部分一样工作,那么您可能需要实现适配器设计模式。据我所知,你不能像以前那样铸造自定义对象。下面的链接有一个很好的例子,其中包含一个实现之前和之后的例子。
适配器设计模式示例