用于隐藏类型特定实现的 Java 泛型?

标签 java generics inheritance polymorphism

我正在尝试创建一个 API,以便其他程序员使用我的服务时不需要实现和类名称。该服务对“项目”执行各种操作,但服务应如何处理项目请求的主要影响因素是基于用户类型。到目前为止,我有一个接口(interface)(Item)和一个实现服务(ItemService),然后是从中扩展的几个用户类型类(例如CompanyItemService )。用户类型还具有一个结构,其中父类(super class)为 User ,子类为 Company:

public class ItemService<T extends User> extends Item {
    User user;
    public ItemService(User user) {
        this.user = user;
    }

    @Override
    public boolean belongsToUser() {
        //Check all records
    }
}

public class CompanyItemService<T extends Company> extends ItemService<Company> {
    public CompanyItemService(Company user) {
        super(user);
    }

    @Override
    public boolean belongsToUser() {
        //Check company specific records
    }
}

public class User {
    //Common user stuff
}

public class Company extends User {
    //Company specific stuff
}

所以我希望能够通过以下调用来使用我的服务:

User company = new Company();
//stuff
Item item = new ItemService<Company>(company)
item.belongsToUser();

但是,当我执行此操作时,将调用 ItemService 中的方法,而不是调用 CompanyItemService 中的重写方法。是否可以获取此重写方法而不需要知道它属于类 CompanyItemService 中?

干杯,

阿列克谢·蓝色。

所有这一切的总体思路是,当发明另一种用户类型时,如果需要,可以添加另一个用户特定的服务,而不影响现有代码。而且,如果有很多用户类型,我只希望使用 API 的人必须记住使用 ItemService 并让泛型完成其余的工作。

最佳答案

您需要使用 abstract factory pattern. 简而言之,您需要一个静态方法,它知道所有可能的 ItemService 子类,并且给定一个 Item 对象或 Class > 是 User 的子类,返回正确 ItemService 子类的实例。换句话说,类似

public static ItemService<?> instance(Class<? extends User> c) {
    if (c == Customer.class)
        return new CustomerItemService();
    else if (c == Employee.class)
        return new EmployeeItemService();
    ...
}

那么你可以说

ItemService<?> service = ItemService.instance(Customer.class);

或者,您可以构建 map :

Map<Class<? extends User>, Class<? extends ItemService>> services = 
    new HashMap<Class<? extends User>, Class<? extends ItemService>>() {{
    put(Customer.class, CustomerItemService.class);
    put(Employee.class, EmployeeItemService.class);
    // more...
}};

那么 instance() 可能看起来像

ItemService<? extends User> instance(Class<? extends User> c) {
    return services.get(c);
}

关于用于隐藏类型特定实现的 Java 泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10703348/

相关文章:

java - Apache Camel : Stop exchange from proceeding to delete=true

java - 使用泛型时复合模式的可扩展性

c# - 类型参数的约束,是否可以有可选类型

java - 如何指定Spring应该使用哪个子类

Java栈的继承

java - 输入不匹配异常错误,

java - 基于颜色直方图的图像搜索

java - 内部类究竟是如何访问外部类中的元素的?

swift - 泛型执行请求,使用泛型

c++ - 派生类中的 sizeof(*this) 和 decltype(*this)