java - 使用泛型和接口,返回类型是对象,而不是类型
问题描述
我有一个 UseCase 接口,简化为以下
public interface UseCase<T> {
T execute(Request request);
}
一个实现的例子是。
public class DefaultCreateUser implements UseCase<User> {
private Request request = new CreateUserRequest();
@Override
public User execute(Request request) {
// create newUser based on request here
return newUser;
}
}
但是,我的执行返回类型不是用户类型,而是对象类型。
我想更好地了解如何在这里正确使用泛型,这是预期的输出吗?我知道我可以将对象转换为用户,但如果我不需要,我想避免这种情况。
解决方案
由于泛型类型擦除,在运行时只有对象。因此,可能需要类。
public abstract class AbstractUseCase<T> implements UseCase<T> {
protected final Class<T> type;
protected AbstractUseCase(Class<T> type) {
this.type = type;
}
@Override
public User execute(Request request) {
// create newUser based on request here
return newUser;
}
}
public class DefaultCreateUser extends AbstractUseCase<User> {
public DefaultCreateUser() {
super(User.class);
}
private Request request = new CreateUserRequest();
@Override
public User execute(Request request) {
return new User();
// Alternative in the base class:
T newUser = type.getConstructor().newInstance();
return newUser;
// Alternative in the base class:
Object newUser = ...;
return type.cast(newUser);
}
}
推荐阅读
- angular5 - 带有 Gitlab 的 Angular 5 CICD
- javascript - 代替与“NaN”进行比较
- python - 部署到 AWS lambda 达到大小限制并且包(例如 numpy)不兼容
- java - Java ProcessBuilder().start() 与 NodeJS require('child_process').spawn()
- gulp - assemble.io 和 gulp 一些内置变量不起作用
- mongodb - Mongoose Sandbox:TypeError:无法读取未定义的属性“长度”
- ruby-on-rails - Rails ActiveRecord 检索具有两个 has_many 关联的关联数据
- iframe - iframe 停止重新加载并显示错误
- node.js - 如何使用循环在自适应卡中添加文本和按钮
- sql-server - 使用数据库链接访问单个列