有没有办法在Java接口中自动装配泛型?

时间:2017-04-23 00:13:10

标签: java spring generics spring-data-jpa

这就是我所拥有的。我试图自动装配JpaRepository,以便我可以通用的方式访问它。

public interface Enabler<T, R> {

    @Autowired
    R repository;

    default ServiceEnabler<T> getEnabler(){
        return new ServiceEnabler<>(repository);
    }
}

public class User implements Enabler<User, UserRepository>, Serializeable {

    private static final long serialVersionUID = -5454763392593161707L;

    Long id;
    String name;
}

@Repository
public UserRepository extends JpaRepository<User, Long> {
    List<User> findByName();
}

@Service
public GenericService<T extends Enabler<T, R>,
                      R extends JpaRepository<T, Long>> {

    List<T> getAll(T generic){
        ServiceEnabler<T> enabler = generic.getEnabler();
        return enabler.getRepo().findAll();
    }
}

无论如何这是可能的吗?

1 个答案:

答案 0 :(得分:2)

&#34;接口的目的&#34;在Java中是为实现接口的所有类定义一个契约; &#34;接口&#34;在Java中不能有任何状态,你只能拥有运行时常量或方法。

现在,由于接口不能具有任何状态,因此您无法创建像R repository;这样的实例变量。

现在来到@Autowired注释,你也做不到,因为这个注释的目的是注入一个对象,就像我之前说过的那样,因为Java接口不能有一个状态所以没有注入的问题对象

所以,总的答案是你不能做你想做的事情,而@Autowired R repository;会导致编译错误。