2017-04-23 100 views
-2

這就是我所擁有的。我正在嘗試自動裝載JpaRepository,以便能夠以通用方式訪問它。有沒有辦法在Java界面自動裝載泛型?

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

這個問題沒有意義,因爲你不能在接口中聲明*實例字段*。 – Andreas

回答

2

Java中「接口」的目的是爲實現接口的所有類定義契約; Java中的「接口」不能有任何狀態,只能有運行時常量或方法。

現在因爲接口不能有任何狀態,所以你不能創建像這樣的實例變量R repository;

現在來到@Autowired註解,這也是你不能做的,因爲這個註解的目的是注入一個對象,現在就像我之前說過的那樣,因爲Java接口不能有一個狀態,所以不存在注入對象的問題。

所以,總體的答案是,你不能做你想做的事情,@Autowired R repository;會導致編譯錯誤。

相關問題