lucas755
lucas755

Reputation: 45

Getting a "cannot find symbol" error with abstract classes

This is for my university class.

I have this top-level abstract class, Expression.java (provided by the professor):

public abstract class Expression {
    public abstract int eval();
    public abstract String toString();
}

BinaryExpression.java (also provided by the professor), which extends Expression.java:

public abstract class BinaryExpression extends Expression {

    protected Expression left;
    protected Expression right;

    public BinaryExpression (Expression l, Expression r) {
        left = l;
        right = r;
    }

    public abstract int eval();
    public abstract String toString();
}

And finally Add.java (I wrote this) extends BinaryExpression.java:

public class Add extends BinaryExpression {

    //Fields
    protected Expression left;
    protected Expression right;

    //Constructor
    public Add(Expression l, Expression r) {
        left = l;
        right = r;
    }

    //Methods
    public int eval() {
        return left.eval()+right.eval();
    }

    public String toString() {
        return left + "+" + right;
    }
}

The tester, Test.java, was provided as well. There are three other classes that extend BinaryExpression, Subtract, Multiply, and Divide, but they are virtually the same as Add. Plus and Minus just store a value, either negative or positive.

public class Test {
    public static void main (String [] args) {
        Expression s1 = new SimpleExpression(10);
        Expression s2 = new SimpleExpression(-3);
        System.out.println("s1: " +  s1 + " = " +  s1.eval());        
        System.out.println("s2: " +  s2 + " = " +  s2.eval());        
        Expression u1 = new Plus(s2);      
        Expression u2 = new Minus(s1);      
        System.out.println("u1: " +  u1 + " = " +  u1.eval());        
        System.out.println("u2: " +  u2 + " = " +  u2.eval());   
        Expression b1 = new Add(u1, s2);  
        Expression b2= new Subtract(s1, u2);
        Expression b3= new Multiply(u1, b1);
        Expression b4= new Divide(u2, b3);   
        System.out.println("b1: " +  b1 + " = " +  b1.eval());        
        System.out.println("b2: " +  b2 + " = " +  b2.eval());        
        System.out.println("b3: " +  b3 + " = " +  b3.eval());        
        System.out.println("b4: " +  b4 + " = " +  b4.eval());   
        Expression e = new Minus( new Multiply(b3, b2));     
        System.out.println("e: " +  e + " = " +  e.eval());   
        // example given in the assignment
        e = new Divide(new Add(new Minus(new SimpleExpression (10)), 
                               new SimpleExpression (50)),
                       new Minus(new Multiply(new SimpleExpression(5),
                                              new Minus (new SimpleExpression (3)))));

        System.out.println("Another e: " + e + " = " +  e.eval());
    }
}

When I compile Test.java, I get this error (and a similar one for Subtract, Multiply, and Divide):

./Add.java:8: cannot find symbol
symbol  : constructor BinaryExpression()
location: class BinaryExpression
    public Add(Expression l, Expression r) {

What's happening?

Upvotes: 0

Views: 4223

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 280167

The root cause is here

public Add(Expression l, Expression r) {
    left = l;
    right = r;
}

Your child class is trying to implicitly invoke a parameterless super constructor. Your parent class does not have such a parameterless constructor. So, instead, invoke its existing constructor

public Add(Expression l, Expression r) {
    super(l, r);
    left = l;
    right = r;
}

Also, you're redeclaring left and right fields in the Add class. There's no point doing this. Your child class already has access to the left and right fields of its parent class, BinaryExpression.

Upvotes: 4

Related Questions