[英]Java, calling static method on elements given from HashMap, how to?
class Depot
{
}
class Depot1 extends Depot
{
public static void callMe() { }
}
class Depot2 extends Depot
{
public static void callMe() { }
}
class Depot3 extends Depot
{
public static void callMe() { }
}
class Depot4 extends Depot
{
public static void callMe() { }
}
HashMap<Integer, Depot> depots;
depots.put("1", new Depot1());
depots.put("3", new Depot3());
現在:
depots.get("1").callMe()
無效的! Depot
沒有callMe()
。 怎么躲呢?
您的代碼有兩個主要問題:
depots.get("1")
類型為Depot
,而Depot
沒有聲明callMe
方法。Depot
確實聲明了callMe
方法,靜態方法也不是虛擬的(因此不可覆蓋),因為它們不是在實例上調用,而是在類上調用。 (這就是 Java 中“靜態”的意思。)所以像depots.get("1").callMe()
這樣的東西會調用Depot.callMe
,而不是Depot1.callMe
。 (這可以說是 Java 中的一個錯誤,當callMe
是靜態方法時,它甚至允許您編寫depots.get("1").callMe()
而不是Depot1.callMe()
。)要解決此問題:
Depot
以聲明一個抽象的、非靜態的callMe
方法。static
關鍵字,因此它們會覆蓋該方法。我相信你誤解了靜態方法的概念。 這些方法與類相關聯,而不是與對象相關聯。 因此,嘗試覆蓋它們是沒有意義的。
您可能需要解釋為什么將callMe
靜態,因為可能有更好的方法來實現您想要的。
我認為你想做的是需要多態性的東西..
您需要包含callMe方法的接口
public interface Depot {
void callMe();
}
及其實現:
public class Depot1 implements Depot{
@Override
public void callMe() {
System.out.println("Depot1!");
}
}
public class Depot2 implements Depot{
@Override
public void callMe() {
System.out.println("Depot2!");
}
}
現在,在您的主類中,您可以從 HashMap 調用 callMe,而無需使用靜態方法。
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Integer, Depot> map = new HashMap<>();
map.put(1, new Depot1());
map.put(2, new Depot2());
map.get(1).callMe(); // Depot1!
map.get(2).callMe(); // Depot2!
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.