有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

访问者模式的java通用化是不可能的?

是否有一种方法可以全面推广访客模式

我的结论是,如果我还想泛化返回值,那么在JAVA中完全泛化访问者模式是不可能的。只能将Visitor/Visitable或ReturnValue设置为通用


Example1-返回值是通用的,但访问者/可访问性不是:

public abstract class PaymentType { //Visitable
    public abstract <T> T accept(PaymentTypeVisitor<T> visitor);
}
public interface PaymentTypeVisitor<T> {
    public T visit(CommissionedPaymentType commissionedPaymentType);
    public T visit(SalariedPaymentType salariedPaymentType);
    public T visit(HourlyPaymentType hourlyPaymentType);
}

Example2-Visitor/Visitable是泛型的,但返回值不是(不安全的泛型):

public interface Visitor<V extends Visitor<V, A>, A extends Visitable<V, A>> {
}
public interface Visitable<V extends Visitor<V, A>, A extends Visitable<V, A>> {
    public abstract <R> R accept(V visitor); //Unsafe generic
}

_

public interface AddEmployeeError extends Error, Visitable<AddEmployeeErrorVisitor, AddEmployeeError> {

}
public interface AddEmployeeErrorVisitor extends Visitor<AddEmployeeErrorVisitor, AddEmployeeError> {
    //Unsafe generics
    <R> R visit(IdAlreadyExistsValidationError idAlreadyExistsValidationError);
    <R> R visit(NameAlreadyExistsValidationError nameAlreadyExistsValidationError);
}

_

public class AddEmployeeUseCaseValidationErrorFormatter implements AddEmployeeErrorVisitor {
    @Override
    protected String format(AddEmployeeError error) {
        return error.accept(this);
    }

    //Unsafe return type
    @Override
    public String visit(IdAlreadyExistsValidationError idAlreadyExistsValidationError) {
        return String.format("%s already owns this id!", idAlreadyExistsValidationError.nameOfExistingUser);
    }

    //Unsafe return type
    @Override
    public String visit(NameAlreadyExistsValidationError nameAlreadyExistsValidationError) {
        return String.format("Name already exists with id: %s", nameAlreadyExistsValidationError.idOfExistingUser);
    }

}

我在这里发现了这个案例:http://musingsofaprogrammingaddict.blogspot.fr/2009/01/visitor-pattern-generic-and-still-type.html


共 (0) 个答案