使用返回超类对象 - Java 的超类方法



我正在使用jar文件中的SimpleMatrix类(EJML,如果你碰巧知道的话)。 我想实现一个新方法来与这个类一起使用,所以决定通过创建MyMatrix类来扩展SimpleMatrix。 但是,当我使用静态超类方法时,我遇到了问题。例如,如果我尝试:

MyMatrix WL = MyMatrix.random64(layerDims[i], layerDims[i-1], min, max, rand);

我收到一个编译错误,要求我将结果转换为 MyMatrix。我相信这是因为该方法返回了一个 SimpleMatrix 对象。如果我尝试:

MyMatrix WL = (MyMatrix)(MyMatrix.random64(layerDims[i], layerDims[i-1], min, max, rand));

程序编译,但随后我收到运行时错误,指出 SimpleMatrix 无法转换为 MyMatrix。为什么我不能投掷它?MyMatrix 只是扩展了超类,并具有一些调用超级构造函数的构造函数,并具有一个附加方法。

我有一个解决方法,通过在MyMatrix中创建一个采用SimpleMatrix的构造函数:

MyMatrix(SimpleMatrix simple)
{
super(simple);
}

我可以这样使用它:

MyMatrix WL = new MyMatrix(MyMatrix.random64(layerDims[i], layerDims[i-1], min, max, rand));

不过,这似乎不对。任何建议我应该如何处理这个问题?

例如,假设你有橙子和苹果,它们是水果,对吧? 所以,你把它们当作水果。

现在,想象一下有人告诉你:这是一个装满水果的袋子,你怎么知道袋子里有什么样的水果? 我的意思是,可以是任何水果。

同样的情况也发生在:

MyMatrix WL = MyMatrix.random64(layerDims[i], layerDims[i-1], min, max, rand);

您正在尝试猜测水果或将水果转换为橙子或苹果,而不知道random64方法将返回哪些水果。 我的意思是,random64方法都可以返回菠萝。

简而言之,您可以为父对象赋值:

class Fruit {}
class Orange extends Fruit {}

您可以执行以下操作:

public Fruit getOrange() {
return new Orange();
}
Fruit fruit = getOrange(); // Because you know Orange is a fruit.

您无法执行以下操作:

Orange fruit = getOrange(); // Because you don't know what's the kind of fruit that will be returned by that method.

希望这有帮助!

调用静态方法时,我建议通过定义它们的实际类而不是某个子类调用。例如static random64是在SimpleMatrix中定义的,因此我喜欢这样称呼它SimpleMatrix.random64

此外,random64并不真正了解MyMatrix,因此它无法返回MyMatrix,只能返回SimpleMatrix

是的,MyMatrixSimpleMatrixSimpleMatrix不一定是MyMatrixrandom64返回类SimpleMatrix的实际实例,该实例不能强制转换为其类层次结构中的较低内容。

您可以这样做:

Object o = (Object) "some string";
String s = (String) o; // because it is actually a String;
SimpleMatrix sm = (SimpleMatrix) new MyMatrix();
MyMatrix mm = (MyMatrix) sm; // because it is actually a MyMatrix

但不是:

String s = (String) new Object(); // because it is not actually a String
MyMatrix m = (MyMatrix) new SimpleMatrix(); // because it is not actually a MyMatrix

最新更新