【问题标题】:How do I access an abstract class' Hashmap?如何访问抽象类的 Hashmap?
【发布时间】:2016-02-10 19:59:05
【问题描述】:

我有两节课。一个是公共类,另一个是具有对象 HashMap 的抽象类。如何从我的公共类中调用抽象类的 HashMap.get(string) 方法?我是 Java 新手,可能会遇到这个问题,因为我不了解如何正确设置我的 java 文件。

这是我的两个课程的部分...(在同一个文件中Evaluator.java)

    public class  Evaluator {
     ...code        
     public int eval (String expr) {
        Operator newOpr = (Operator) operators.get(tok);
     }
    ... more code
    } 



//abstract class

    abstract class Operator {

        Operator(){
        HashMap operators = new HashMap();
        operators.put("+",new AdditionOperator()); 
        operators.put("-",new SubtractionOperator());
        }

        abstract int priority();

        static boolean check(String tok){
        return true;
        }   

        abstract Operand execute(Operand opd1, Operand opd2);

    }

    //priority 2, addition and subtraction
    class AdditionOperator extends Operator{
        @Override 
        int priority(){
            return 2;
        }

        @Override
        public Operand execute (Operand op1, Operand op2){
          ...code
        }

    }

【问题讨论】:

  • 您的抽象类是否有一个公开访问HashMap 或其get 方法的方法?它需要一个。
  • 你能把你的课程代码贴出来吗?
  • 如果可以,请将 hashMap (theMap) 设为静态。否则,您必须对其进行子类化才能访问其实例方法。
  • 抽象方法没有get。它是一个名为 Operator 的类,用于扩展创建运算符对象,例如 AdditionOperator 或 SubtractionOperator。
  • 我编辑了我的评论。通常,如果你有一个抽象类,你会想要继承它。

标签: java class hashmap abstract


【解决方案1】:

欢迎来到 Java 世界! 如果您想要一个准确的答案,请给我们您的两个类(公共和抽象)的代码。

您可能需要创建一个非抽象类来扩展抽象类来调用该方法。

【讨论】:

  • 好的将发布此代码。我不想发布我的代码,因为它基本上是在寻求调试帮助。
【解决方案2】:

你不能只调用抽象类的方法。你需要一个类的实例。由于该类是抽象的,因此您必须为其创建一个具体的类来获取方法。

class Foo extends AbstractFoo
{
    ... Implement any required methods ...
}

现在你可以这样做了:

Foo bar = new Foo();
bar.get("thing");

【讨论】:

    【解决方案3】:

    该问题的直接答案是使您的 HashMap 成为公共字段或静态字段。

    abstract class Operator {
            public static HashMap operators;
            Operator(){
              Operator.operators = new HashMap();
              Operator.operators.put("+",new AdditionOperator()); 
              Operator.operators.put("-",new SubtractionOperator());
            }
        }
    
    public class  Evaluator {
     ...code        
     public int eval (String expr)
        Operator newOpr = (Operator) Operator.operators.get(tok);
     }
     ... more code
    } 
    

    我会说 HashMap 属于错误的类。这样,您的 HashMap 必须是静态字段或公共字段。在我看来,您甚至不需要 Operator Abstract 类。一个接口可以完成这项工作,HashMap 可以在一个名为 OperatorFactory 的类中,并且只公开一个公共方法 Operator create(string operator)。这样,您的 Evaluator 类甚至不需要知道其他类使用的内部数据结构是什么。

    interface Operator(){
    
         public Operand execute(Operator op1, Operator op2);
    }
    
    public class AdditionOperator implements Operator{
        public Operand execute(Operand op1, Operand op2){
            return op1;
        }
    
    }
    
    public class OperatorFactory(){
        //Could use a HasMap internally in this class but it doesn't matter 
        //to the other classes
        public Operator crate(string operator){
            if( operator == "+")
               return new AdditionOperator();
        }
    
    }
    
     public class  Evaluator {
        ...code        
        OperatorFactory operatorFactory;
        public Evaluator(OperatorFactory operatorFactory){
           operatorFactory = operatorFactory;
        }
        public int eval (String expr) {
           Operator newOpr = operatorFactory.create(tok);
        }
        ... more code
     } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2019-07-09
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多