簡體   English   中英

Java,對從 HashMap 給出的元素調用靜態方法,如何?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM