2017-08-15 112 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這應該不成問題 –