Play Framework 2.1.0没有看到派生类的静态方法

时间:2013-06-29 23:34:59

标签: java scala inheritance playframework-2.0

我正在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

在我看来它应该有用,但它不会......我错过了什么?

谢谢!

1 个答案:

答案 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