Java,对HashMap中给定的元素调用静态方法,如何?

Java,对HashMap中给定的元素调用静态方法,如何?,java,hashmap,Java,Hashmap,无效!在Depot中没有callMe()。如何避开它?您的代码有两个主要问题: Depot.get(“1”)具有类型Depot,并且Depot不声明callMe方法 即使Depot声明了callMe方法,静态方法也不是虚拟的(因此不可重写),因为它们不是在实例上调用的,而是在类上调用的。(这就是“static”在Java中的意思。)因此类似于depots.get(“1”).callMe()的东西将调用Depot.callMe,而不是Depot1.callMe。(在Java中,当callMe是静

无效!在
Depot
中没有
callMe()
。如何避开它?

您的代码有两个主要问题:

  • Depot.get(“1”)
    具有类型
    Depot
    ,并且
    Depot
    不声明
    callMe
    方法
  • 即使
    Depot
    声明了
    callMe
    方法,静态方法也不是虚拟的(因此不可重写),因为它们不是在实例上调用的,而是在类上调用的。(这就是“static”在Java中的意思。)因此类似于
    depots.get(“1”).callMe()的东西将调用
    Depot.callMe
    ,而不是
    Depot1.callMe
    。(在Java中,当
    callMe
    是静态方法时,它甚至允许您编写
    depots.get(“1”).callMe()
    而不是
    Depot1.callMe()
    ,这无疑是一个错误。)
要解决此问题,请执行以下操作:

  • 更改
    Depot
    以声明抽象的、非静态的
    callMe
    方法
  • 删除其子类中的
    static
    关键字,以便它们重写该方法

    • 我相信您误解了静态方法的概念。这些方法与类关联,而不是与对象关联。因此,试图覆盖它们是没有意义的


      您可能需要解释为什么要将
      callMe
      设置为静态,因为可能有更好的方法来实现您想要的。

      我认为您想要做的是需要多态性的事情

      您需要一个包含callMe方法的接口

      depots.get("1").callMe()
      
      及其实施:

      public interface Depot {
          void callMe();
      }
      
      现在,在主类中,您可以从HashMap调用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!");
          }
      
      }
      
      import java.util.HashMap;
      导入java.util.Map;
      公共班机{
      公共静态void main(字符串[]args){
      Map Map=newhashmap();
      map.put(1,newdepot1());
      map.put(2,新Depot2());
      map.get(1.callMe();//Depot1!
      map.get(2.callMe();//Depot2!
      }
      }
      
      您的方法名称不一致。
      getStarterDirection
      callme
      之间的关系是什么?您试图在哪里定义
      getStarterDirection
      ?我在你的定义中看不到它。您的基本
      Depot
      类不包含任何方法,因此您希望如何对其进行调用?抱歉,我已经解决了这个问题。@JohnSmith多态性不适用于静态方法。因此,您调用的每种类型
      callMe
      实际上都会从Depot调用静态方法。我很震惊,这不是我第一次遇到这种静态的东西。那些“callMe”返回静态数据。我的意思是,这就像得到一个最终的整数,或者一个常数,或者类似的东西。其结果取决于类本身,而不是它的实例。就像Math.max不是静态的一样。创建新的Math().max有什么意义?
      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!");
          }
      
      }
      
      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!
              }
      
          }