2017-08-15 111 views
0

我想要替换使用泛型如下:传递泛型类和对象的Java方法

  • for (Post post : postResponse.getResults()) {,其中Post可以是任何POJO。
  • List<Post> posts = postResponse.getResults();其中List<Post>可以是我传入它的任何东西的列表。

我的方法调用和方法体是什么样的?方法调用的

不同的例子:

retrieveData(mCardAdapter, new Post(), Post.class); 
retrieveData(mCardAdapter, new Contact(), Contact.class); 
retrieveData(mCardAdapter, new Product(), Product.class); 
retrieveData(mCardAdapter, new Booking(), Booking.class); 

方法:

private void retrieveData(final CardAdapter mCardAdapter, final Object<T> postObject, Class<T> postClass) { 
     RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT); 
     service.getPosts() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<PostResponse>() { 
        @Override 
        public final void onCompleted() { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", "Retrofit Request Completed!"); 
        } 

        @Override 
        public final void onError(Throwable e) { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", e.getMessage()); 
        } 

        @Override 
        public final void onNext(PostResponse postResponse) { 
         if (postResponse != null) { 

          Log.e("RetrofitService", "Returned objects: " + postResponse.getResults()); 

          for (postObject post : postResponse.getResults()) { 
           Log.e("RetrofitService", post.getObjectId() + ": " + post.getText()); 
          } 

          setRefreshingFalse(); 

          mCardAdapter.clear(); 
          List<postClass> posts = postResponse.getResults(); 
          mCardAdapter.addData(posts); 

         } else { 
          Log.e("RetrofitService", "Object returned is null."); 
         } 

        } 

       }); 
    } 

我越来越Unknown class: 'tClass'Unknown class: 'postClass'。显然,这不是做这件事的方法,所以也许把我上面显示的代码作为pseduo代码。这是有道理的我想要什么?我真的想要这种retrieveData方法生成,以便我可以用来查询差异类。

帮助理解。 我想避免什么:

retrievePosts(mCardAdapter); 
retrieveUsers(mCardAdapter); 

private void retrievePosts(final CardAdapter mCardAdapter) { 
     RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT); 
     service.getPosts() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<PostResponse>() { 
        @Override 
        public final void onCompleted() { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", "Retrofit Request Completed!"); 
        } 

        @Override 
        public final void onError(Throwable e) { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", e.getMessage()); 
        } 

        @Override 
        public final void onNext(PostResponse postResponse) { 
         if (postResponse != null) { 
          Log.e("RetrofitService", "Returned objects: " + postResponse.getResults()); 

          for (Post post : postResponse.getResults()) { 
           Log.e("RetrofitService", post.getObjectId() + ": " + post.getText()); 
          } 

          /*for (Post post : postResponse.getResults()) { 
           mCardAdapter.addData(post); 
          }*/ 

          setRefreshingFalse(); 

          mCardAdapter.clear(); 
          List<Post> posts = postResponse.getResults(); 
          mCardAdapter.addData(posts); 

         } else { 
          Log.e("RetrofitService", "Object returned is null."); 
         } 

        } 

       }); 
    } 

    private void retrieveUsers(final CardAdapter mCardAdapter) { 
     RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT); 
     service.getUsers() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<PostResponse>() { 
        @Override 
        public final void onCompleted() { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", "Retrofit Request Completed!"); 
        } 

        @Override 
        public final void onError(Throwable e) { 
         setRefreshingFalse(); 
         Log.e("RetrofitService", e.getMessage()); 
        } 

        @Override 
        public final void onNext(PostResponse postResponse) { 
         if (postResponse != null) { 
          Log.e("RetrofitService", "Returned objects: " + postResponse.getResults()); 

          for (User user : userResponse.getResults()) { 
           Log.e("RetrofitService", user.getObjectId() + ": " + user.getText()); 
          } 

          /*for (Post post : postResponse.getResults()) { 
           mCardAdapter.addData(post); 
          }*/ 

          setRefreshingFalse(); 

          mCardAdapter.clear(); 
          List<User> users = userResponse.getResults(); 
          mCardAdapter.addData(users); 

         } else { 
          Log.e("RetrofitService", "Object returned is null."); 
         } 

        } 

       }); 
    } 
+0

“Post”是什么意思可以是任何Pojo?你如何计划调用它的方法,如果你不在乎它会是什么样的对象。 –

+0

该方法只是调用改造请求。它不应该影响我传入的内容。 – santafebound

+0

我只想完全重用该方法。就像,这次你打电话给帖子。然后,下次你打电话给联系人,人们,无论如何。 – santafebound

回答

0

如果我明白你的问题正确,你希望有不同类别的通用方法。我没有看到你正在给List添加一些东西,所以这可能对你有用。

private <clazz> void retrieveData(final Class<?> clazz) { 
for (clazz post : postResponse.getResults()) { 
    // you can't do anything here since clazz can be anything 
    } 
    List<clazz> posts = postResponse.getResults(); 
} 
+0

我在方法头中得到一个警告:''finaltype clazz''从来没有用过,即使我在这里使用它:''List posts = clazzResponse.getResults();''。我调用这样的方法:''retrievePosts(mCardAdapter,Post.class);'' – santafebound

+0

@santafebound这应该不成问题 –