2

我正在使用Play Framework 2.1.0with Java,我遇到了一个我不太明白的奇怪错误。

我在包 models.entitiesAnimal.java中有一个基类,它定义了一个公共静态方法List<AnimalType> getAllCows(),如下所示:

package models.entities;

public class Animal {
     public static List<Cow> getAllCows() {}
}

然后我有一个扩展动物的类:

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

在我看来它应该工作,但它没有......我错过了什么吗?

谢谢!

4

1 回答 1

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()将重新使用类实现。

但是,请注意,这不会给您polymorphism。您只是重新实现了(类的)方法,也称为方法隐藏。所以,如果你要运行以下

Animal animal = new Cow();
animal.getAllCows(); // would print: Animal.getAllCows() invoked
于 2013-06-29T23:57:39.183 回答