2013-06-29 72 views
2

我正在使用Play Framework 2.1.0Java,並且我遇到了一個我不太明白的奇怪錯誤。Play Framework 2.1.0不能從派生類中看到靜態方法

我有一個基類在包models.entities Animal.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 

在我看來,它應該工作,但它不...我缺少的東西?

謝謝!

回答

3

A 靜態方法只屬於聲明它。因爲它只是定義它的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 
相關問題