java - How can I refactor a method with an unknown Class as a parameter? -
i want make method reusable i'm not sure how provide parameter work in following context:
service.getposts() // method called, i.e. getposts() should vary depending on class parameterfor (post object : postresponse.getresults()) { // want post class come parameterlist<post> objects = postresponse.getresults(); // want class passed list come same parameter
method call:
retrievedata(mcardadapter, post.class);   method:
private void retrievedata(final cardadapter mcardadapter, final class classparam) {         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());                              (post object : postresponse.getresults()) {                                 log.e("retrofitservice", object.getobjectid() + ": " + object.gettext());                             }                              /*for (post post : postresponse.getresults()) {                                 mcardadapter.adddata(post);                             }*/                              setrefreshingfalse();                              mcardadapter.clear();                             list<post> objects = postresponse.getresults();                             mcardadapter.adddata(objects);                          } else {                             log.e("retrofitservice", "object returned null.");                         }                      }                  });     }   when pass class classparam, unkown class: 'classparam' error.
service:
public interface retrofitservice {      string service_endpoint = "https://parseapi.back4app.com";  @headers({             "x-parse-application-id: asdf",             "x-parse-rest-api-key: asdf"     })     @get("/classes/post")     observable<postresponse> getposts();  }   post object:
public class post implements serializable {      private static final string class_name = "post";      private string objectid;     private string text;      public post() {     }      public string getclassname() {         return class_name;     }      public string getobjectid() {         return objectid;     }      public void setobjectid(string objectid) {         this.objectid = objectid;     }      public string gettext() {         return text;     }      public void settext(string text) {         this.text = text;     }  }   updated (according roman's suggestions):
you did not show postresponse code, suppose it's this:
public class postresponse {     private list<post> results;      public list<post> getresults() {         return results;     }      .... }   then this.
first, parameterize response (to used instead of postresponse):
public class response<t> {     private list<t> results;      public list<t> getresults() {         return results;     }      .... }   second, change main method signature using type parameter:
private <t> void retrievedata(final cardadapter mcardadapter, final class<t> classparam, datasaver<t> saver) { ... }   inside retrievedata() method use t instead of post , response<t> instead of postresponse.
but have deal with
mcardadapter.adddata(objects);   here, simple type parametrization not work. have use last parameter (saver) put results container:
saver.save(results);   and in saver implementation do
public void save(list<post> posts) {     mcardadapter.adddata(posts); }   datasaver generic well:
public interface datasaver<t> {     void save(list<t> objects); }      

Comments
Post a Comment