我正在使用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));
但这似乎并不合适。有什么建议我应该如何处理这个?
答案 0 :(得分:1)
例如,假设你有橘子和苹果,它们是水果,对吧? 所以,你把它们视为水果。
现在,想象有人告诉你:这是一个装满水果的袋子,你怎么知道袋子里面有什么样的水果?我的意思是,可能是任何水果。
同样的情况发生在:
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.
希望这有帮助!
答案 1 :(得分:0)
当调用静态方法时,我建议调用它们所定义的实际类而不是某些子类。例如static random64
中定义SimpleMatrix
,因此我喜欢称之为SimpleMatrix.random64
同样random64
并不真正了解MyMatrix
因此无法返回MyMatrix
,只能返回SimpleMatrix
。
是MyMatrix
是SimpleMatrix
,但SimpleMatrix
不一定是MyMatrix
。 random64
返回类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