【问题标题】:Using super class methods that return a super class object - Java使用返回超类对象的超类方法 - Java
【发布时间】:2017-12-21 19:11:40
【问题描述】:

我正在使用 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));

这似乎不太对劲。有什么建议我应该如何处理?

【问题讨论】:

  • 在不知道您要达到的目标的情况下很难回答这个问题。但是random64 方法会生成SimpleMatrix - 它不可能生成MyMatrix,因为这不是您的方法。如果您想要一个生成MyMatrix 的方法,您需要自己编写。

标签: java inheritance casting


【解决方案1】:

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

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

同样的情况发生在:

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

您试图猜测或将 Fruit 转换为 Orange 或 Apple,但不知道 random64 方法将返回什么 Fruit。我的意思是,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.

希望这会有所帮助!

【讨论】:

  • 嗨。我都准备好理解“人中的学生”,但人不一定是学生的概念。但我认为 SimpleMatrix 也将是 MyMatrix 因为它没有额外的属性 - 只是一个额外的方法。在我的场景中,继承对我没有用吗?我想要的只是另一种操作 SimpleMatrix 的方法。通常我会将新方法放在 SimpleMartix 中,但我认为我不能这样做,因为我使用 .jar 文件来访问 SimpleMatrix
【解决方案2】:

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

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

是的MyMatrixSimpleMatrix,但SimpleMatrix 不一定是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

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 2015-07-17
    • 2015-11-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多