java - Play Framework 2.1.0 看不到派生类中的静态方法

标签 java scala inheritance playframework-2.0

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

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

相关文章:

java - Hikari 连接不可用和意外的多池问题

java - Kafka的分区选择算法

arrays - Scala 数组泛型与向量泛型

C++:模板化基类的范围?

python - python 中具有相同成员和 super 的类的菱形继承(钻石问题)

Java DataInputStream 有时返回空

java - isAnnotationPresent() 在 Java 中与父类(super class)型引用一起使用时返回 false

Java根据 boolean 条件将列表分类为多个列表

scala - 如何在处理速率限制时异步发送 HTTP 请求?

java - Java 中是否存在类似于 <getClass()> 泛型参数的东西?