我正在Play Framework 2.1.0
使用Java
,我遇到了一个我不太明白的奇怪错误。
我在包models.entities Animal.java
中有一个基类,它定义了一个公共静态方法List<AnimalType> getAllCows()
,如下所示:
package models.entities;
public class Animal {
public static List<Cow> getAllCows() {}
}
然后我有一个扩展Animal的类:
package models;
public class Cow extends Animal {
}
从我的Scala模板show_animals.scala.html,我可以调用以下内容:
models.entities.Animal.getAllCows()
但是当我尝试使用扩展类调用静态方法时,它的错误如下:
Cow.getAllCows()
value getAllCows is not a member of object models.Cows
在我看来它应该有用,但它不会......我错过了什么?
谢谢!
答案 0 :(得分:3)
静态方法仅属于声明它的类。因为,只有Animal
类定义了它,Cow.getAllCows()
才会抛出错误。您可以将其视为通过命名空间(其类名)访问的全局方法。 实例方法被继承(使用多态)的方式不适用于静态方法。
这个概念有点难以掌握,因为如果你要写下Cow
类,它会起作用。
public class Cow extends Animal {
public static List<Cow> getCows() {
return getAllCows(); // inherited; or some prefer visible
}
}
因此,如果您将代码更改为
public class Animal {
public static List<Cow> getAllCows() {
System.out.println("Animal.getAllCows() invoked");
}
}
public class Cow extends Animal {
public static List<Cow> getAllCows() {
System.out.println("Cow.getAllCows() invoked");
return Animal.getAllCows();
}
}
Cow.getAllCows()
可以重复使用 base 类实现。
但请注意,这不会为您提供多态。您只需重新实现( base 类)的方法,也称为方法隐藏。所以,如果你要运行以下
Animal animal = new Cow();
animal.getAllCows(); // would print: Animal.getAllCows() invoked