2016-12-08 2 views
0

Я пытаюсь реализовать шаблон дизайна посетителя, у меня есть структура класса с множеством классов и переменных типов возврата между операцией, которую я хочу делать с посетителем.Java: error: класс не является абстрактным и не отменяет абстрактного метода accept (посетитель). При внедрении Visitor

Я получаю много ошибки компиляции Classname is not abstract and does not override abstract method accept(Visitor) in Visitable, несмотря на то, что внимательно следил за шаблоном посетителя.

Например мой класс Добавить

public class Add extends BinaryExpression implements Visitable { 
/* content of the class supressed */ 
    public Integer accept(Visitor v) { 
     return v.visit(this); 
    }   
} 

В случае посетителя для Add класса, он всегда будет возвращать Int, но посетитель для некоторых других классов будет возвращать другие типы или даже тип переменных в пределах одного класс.

На моем Visitable интерфейса я (с помощью универсальных типов для типов переменного возврата.)

public interface Visitable<T> { 
    public T accept(Visitor v);} 

На моем посетитель интерфейса у меня есть

public interface Visitor<T> { 
    public T visit(Add c); 

Моего оценщик посетители

public class Evaluator<T> implements Visitor{ 
    public Integer visitAdd(Add c){ 
    return c.first().accept(this) + c.second().accept(this); 
    } 

Снимок экрана с полной ошибкой error

ОБНОВЛЕНО экран ошибки updated error screen

+0

Я считаю, что это потому, что вы не питая универсального типа когда вы реализуете посещение. Например, я думаю, что это должно быть _implements Visitable _. – StaticShadow

+0

Это не решило проблему, к сожалению. Получение точной ошибки – spacing

ответ

2

Ошибка в том, что int примитивно не Object типа в отличие от Integer. Другими словами, Универсальные типы принимают только объект ссылочные типы, но не примитивы, поэтому изменить accept(Visitor v) метод тип возвращаемого в Integer так, что он будет компилировать:

public class Add extends BinaryExpression implements Visitable { 
    public Integer accept(Visitor v) { 
     return v.visit(this); 
    }   
} 
+0

Это очень хорошо, но я думаю, что вы имеете в виду 'Visitable ' – emory

+0

Нет, этот конкретный 'accept (Visitor v)' реализация возвращает объект Integer, но 'Visitable' все еще может быть общим – developer

+0

Итак, это решил много моих проблем, я не знал об этом, однако ошибка все еще стоит './Add.java:32: ошибка: несовместимые типы: объект не может быть преобразован в Integer return v.visitAdd (this); ' – spacing

Смежные вопросы