我正在使用Play Framework 2.1.0
与 Java
,我遇到了一个我不太明白的奇怪错误。
我在 models.entities 包中有一个基类 Animal.java
定义了一个公共(public)静态方法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
在我看来,它应该有效,但它不起作用......我错过了什么吗?
谢谢!
最佳答案
静态方法仅属于声明它的类。因为只有 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()
可以重用基类实现。
但是,请注意,这不会给您带来多态性。。您只需重新实现(基类的)方法,也称为方法隐藏。因此,如果您要运行以下命令
Animal animal = new Cow();
animal.getAllCows(); // would print: Animal.getAllCows() invoked
关于java - Play Framework 2.1.0 看不到派生类中的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385682/