首页 > 解决方案 > 使用泛型和接口,返回类型是对象,而不是类型

问题描述

我有一个 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;
    }
}

但是,我的执行返回类型不是用户类型,而是对象类型。

我想更好地了解如何在这里正确使用泛型,这是预期的输出吗?我知道我可以将对象转换为用户,但如果我不需要,我想避免这种情况。

标签: javagenerics

解决方案


由于泛型类型擦除,在运行时只有对象。因此,可能需要类。

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);
    }
}

推荐阅读