繁体   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