gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:25:46 27 4
gpt4 key购买 nike

我正在尝试创建一个 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 对象或一个 ClassUser 的子类,返回正确的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com