2015-01-22 14 views
7

tôi đang làm việc trên một ứng dụng Android và tôi đang cố gắng để tiêm một lĩnh vực mà là gõ tham số trong một lớp trừu tượng: BaseListFragmentdao găm không thể tiêm loại tham số lĩnh vực

public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment 
{ 
    @Inject protected S service; 
} 

Nhưng tôi có được điều này báo lỗi sau tại biên dịch: lỗi: không thể tìm thấy lớp biểu tượng S

đây là mã của tôi cho BaseFragment:

public class BaseFragment extends Fragment 
{ 
    @Override public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     ((App) getActivity().getApplication()).inject(this); 
    } 
} 

đây là mô-đun dịch vụ của tôi:

@Module(
     complete = false, 
     library = true 
) 
public class ServiceModule 
{ 
    @Provides @Singleton BucketService provideBucketService(RestAdapter restAdapter) 
    { 
     return restAdapter.create(BucketService.class); 
    } 

    @Provides @Singleton ProjectService provideProjectService(RestAdapter restAdapter) 
    { 
     return restAdapter.create(ProjectService.class); 
    } 

    @Provides @Singleton ShotService provideShotService(RestAdapter restAdapter) 
    { 
     return restAdapter.create(ShotService.class); 
    } 

    @Provides @Singleton TeamService provideTeamService(RestAdapter restAdapter) 
    { 
     return restAdapter.create(TeamService.class); 
    } 

    @Provides @Singleton UserService provideUserService(RestAdapter restAdapter) 
    { 
     return restAdapter.create(UserService.class); 
    } 
} 

Và đây là một ví dụ về một lớp học kéo dài BaseListFragment:

public class ProjectFragment extends BaseEntityFragment<Project, ProjectViewAdapter, ProjectService> 
{ 
} 

Liệu có cách nào để tiêm một loại tham số?

Kính trọng,

Trả lời

5

Tính đến phiên bản 2.0.1, Dagger 2 khôngsupport loại tiêm mà bạn đang nói đến. Hãy xem GenericTest cho tất cả các hoán vị khác nhau.

0

Tôi cũng không thể có được nó làm việc một trong hai và tôi nghĩ rằng đó là chống lại triết lý thiết kế của dao găm, mà là để tạo mã đó là chính xác những gì một nhà phát triển cũng sẽ viết.

Trong trường hợp này, nó tạo bộ điều hợp phun cho lớp trừu tượng và một bộ chuyển đổi khác cho lớp bê tông. Với các đối số chung cho lớp trừu tượng, về cơ bản bạn phải tiêm các trường từ lớp trừu tượng trong mỗi bộ phun lớp cụ thể.

Nếu đó không phải là đối tượng android (thời gian chạy android tạo), tôi khuyên bạn nên chuyển dịch vụ trong cuộc gọi tới nhà xây dựng siêu.

Trong trường hợp này, tôi muốn đề nghị để tiêm dịch vụ trong các lớp bê tông và để cung cấp nó sử dụng một phương pháp trừu tượng:

protected abstract S getService(); 
4

Tôi đã có cùng một vấn đề và nhận được xung quanh nó bằng cách thêm một lớp bên trong không tham số và tiêm vào đó. Sau đó, sử dụng một getter để có được các lớp học tiêm ra.

Có vẻ như sau:

public class MainClass<T>{ 

    UtilityClass utility; 

    public MainClass(){ 
     utility = new InjectorHelper().getHelper(); 
    } 

    ... 

    public static class InjectorHelper{ 

     @Inject 
     UtilityClass utilityClass; 

     public InjectorHelper(){ 
      Injector.getInstance().getAppComponent().inject(this); 
     } 

     public UtilityClass getUtilityClass(){ 
      return utilityClass 
     } 
    } 
} 
Các vấn đề liên quan