簡體   English   中英

將通用類和對象傳遞給Java方法

[英]Passing generic classes and objects to a Java method

我想用泛型替換以下內容:

  • 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.");
                        }

                    }

                });
    }

如果我正確理解了您的問題,則希望對不同的類使用通用方法。 我沒有看到您在列表中添加了某些內容,因此這可能對您有用。

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM