使用泛型和接口,返回类型是对象,而不是类型

时间:2019-10-10 14:47:55

标签: java generics

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

但是,我的execute的返回类型不是User类型,而是Object类型。

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

1 个答案:

答案 0 :(得分:1)

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

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