openCV中的Java多态性
好吧,这可能是个愚蠢的问题,但我对java有点生疏,所以。。。为了添加新的变量,我扩展了Mat类。它按预期工作,但当我尝试使用返回母类类型并将其分配给子类的方法时,如下所示:openCV中的Java多态性,java,opencv,casting,Java,Opencv,Casting,好吧,这可能是个愚蠢的问题,但我对java有点生疏,所以。。。为了添加新的变量,我扩展了Mat类。它按预期工作,但当我尝试使用返回母类类型并将其分配给子类的方法时,如下所示: Supermat Matchild; <-- (essentially the wrapper class i've made) MatChild = (Supermat) imread(name); 有人能告诉我为什么会发生这种情况以及是否有解决办法吗?您的命名和代码风格令人困惑。即使这两条线也很
Supermat Matchild; <-- (essentially the wrapper class i've made)
MatChild = (Supermat) imread(name);
有人能告诉我为什么会发生这种情况以及是否有解决办法吗?您的命名和代码风格令人困惑。即使这两条线也很难理解。学习Java编码标准 你说你这样做了:
public class CustomMat extends Mat {
}
这意味着您可以在代码中调用Mat
的任何位置使用CustomMat
Mat mat = new CustomMat();
为什么这样做有效?因为aCustomMat
是-aMat
;这就是继承的意义
如果给您一个
Mat
引用,并且您确定它指向一个CustomMat
实例,那么您可以强制转换它。但你已经失去了多态性的好处。这就是所谓的“切片问题”。我对OpenCV不太熟悉,但是如果它像Java的其他部分一样工作,那么您可能需要实现适配器设计模式。据我所知,您不能像以前那样投射自定义对象。下面的链接提供了一个很好的示例,其中包含了一个前后实现
仅仅因为所有的超级大鼠都是超级大鼠并不意味着所有的超级大鼠都是超级大鼠。确切地说,多态性不是这样工作的。您的变量名似乎有错误
Matchild
与Matchild
不同。有案件敏感性这只是一个打字错误@GeorgeDyes我知道,但由于SuperMat只是将属性添加到Mat,我不知道问题出在哪里。是的,但在这种情况下,您不会丢失CustomMat属性吗?Sry用于糟糕的编码btw,不再使用java编写。(如我所说,我很生疏)是的。这就是所谓的切片问题。如果您得到一个Mat引用,并且您知道它指向一个CustomMat实例,那么您可以强制转换它。但您已经失去了多态性的好处。问题是,opencv libs中有一个Mat类,但它不能满足我的目的,具体来说,我需要添加一个与Mat元素关联的属性int[][]标签(我需要区域增长算法的标签)我记得有件事,那是我的B计划,我想我会同意的,非常感谢,先生,非常欢迎。我有一个学校项目,在那里我通过艰苦的方式学到了这一点。有很多适配器设计模式的例子,但是如果你被卡住了,请告诉我。
Mat mat = new CustomMat();