gpt4 book ai didi

java - 不能用不同类型的参数继承

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

假设您有 EntityService<E> , PersonService extends EntityService<Person> , EmployeeService extends EntityService<Employee>等等。现在假设你想创建一个 SuperService聚合其他服务,这些服务将暴露给外部世界。由于泛型删除,你不能写 SuperService extends PersonService, EmployeeService , ... 有没有办法不用为每个服务写具体的方法名就可以解决这个问题?

public interface EntityService<E> {
E find(long id);
...
}

public interface PersonService extends EntityService<Person> { }
public interface EmployeeService extends EntityService<Employee> { }

// ERROR - SuperService can not be inherited with different types arguments
public interface SuperService extends PersonService, EmployeeService {}

目前我正在写具体方法在SuperInterface委托(delegate)给基础服务。我很好奇,是否有一些注释处理器能够以最小的努力生成工作服务接口(interface)。

最佳答案

您是在暗示您想要此 API 的单一入口点,因此您的 SuperService。如果是这样,并且您不介意转换:

  1. 将服务存储在Map
  2. 要求客户指定他们想要访问的内容。

这允许轻松存储服务,以及访问客户想要的实体的简单方法。

class SuperService {
private Map<Class<?>, EntityService<?>> services = ...;

public SuperService() { //populate the map somehow..
services.put(Person.class, new PersonServiceImpl());
services.put(Employee.class, new EmployeeServiceImpl());
}

public <E> E find(long id, Class<E> type) {
E service = services.get(type);
if(service == null)
throw new IllegalArgumentException("This API does not provide a service for the specified type.");

return (E) service.find(id);
}
}

这缺乏类型安全。但是,您可以通过以下方式实现类型安全:

  • 正确的类型绑定(bind):每个实体都应该共享一个通用类型
  • 通过访问者模式(与instanceof 类型检查相反,或者更糟:没有实际的类型检查)实现多重分派(dispatch)。

您现在可以真正将服务封装在您的 API 中:客户端只知道实体,不知道用于获取该实体的实际服务。

客户端将按如下方式使用它:

SuperService service = new SuperService();
Person person = service.find(50, Person.class);

关于java - 不能用不同类型的参数继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52376536/

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