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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用返回超类对象的超类方法 - 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 random64SimpleMatrix中定义,因此我喜欢称之为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

以上是关于使用返回超类对象的超类方法 - Java的主要内容,如果未能解决你的问题,请参考以下文章

Java超类-java.lang.object

如何从别处调用 Objective-C 对象的超类的方法?

Object:所有类的超类

@Override 方法不会覆盖它的超类

Proguard - 找不到常见的超类/java.lang.VerifyError

为啥我不能将 B 的超类对象放入 Container<?超级B>? [复制]