简体   繁体   English

将通用类和对象传递给Java方法

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

I want to replace the following with generics: 我想用泛型替换以下内容:

  • for (Post post : postResponse.getResults()) { , where Post can be any POJO. for (Post post : postResponse.getResults()) { ,其中Post可以是任何POJO。
  • List<Post> posts = postResponse.getResults(); where List<Post> can be a list of anything I pass into it. 其中List<Post>可以是我传入的所有内容的列表。

What would my method call and method body look like? 我的方法调用和方法主体是什么样的?

Different examples of method calls: 方法调用的不同示例:

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

Method: 方法:

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

                    }

                });
    }

I'm getting Unknown class: 'tClass' and Unknown class: 'postClass' . 我正在获得Unknown class: 'tClass'Unknown class: 'postClass' Obviously this is not the way to do it so perhaps treat what I've shown above as pseduo-code. 显然,这不是做到这一点的方法,因此也许将我上面显示的内容视为pseduo代码。 Does it makes sense what I'm trying to? 我要做什么有意义吗? I really want to generify this retrieveData method so that I can be used to query differences classes. 我真的想泛型化这个retrieveData方法,以便我可以用于查询不同的类。

To help with understanding. 帮助理解。 What I want to avoid: 我要避免的是:

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

                    }

                });
    }

If I understood your question correctly you want to have a generic method for different classes. 如果我正确理解了您的问题,则希望对不同的类使用通用方法。 I did not see that you are adding something to the List so this might work for you. 我没有看到您在列表中添加了某些内容,因此这可能对您有用。

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