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