2

を使用Play Framework 2.1.0してJavaいますが、よくわからない奇妙なエラーに遭遇しました。

以下に示すように、パッケージ models.entitiesAnimal.javaに public static method を定義する基本クラスがあります。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

うまくいくように思えますが、うまくいきません...何か足りないのですか?

ありがとう!

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を提供しないことに注意してください。method-hidingとも呼ばれる (基本クラスの)メソッドを再実装しただけです。したがって、次を実行する場合

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