BaseThing , :
public abstract class BaseThing {
public abstract <T extends BaseThing> ThingDoer<T, String> getThingDoer();
}
, . , <T> . : public <T> Class<T> classOf(T object). . , - "" generic ( ), , Collections: public <T> List<T> emptyList(). , <T> ; , emptyList() , . - T, .
. BaseThing:
public class SomeThing extends BaseThing {
public ThingDoer<SomeThing, String> getThingDoer() {
return Things.getSomeThingDoer();
}
}
public class SomeOtherThing extends BaseThing {
public ThingDoer<SomeOtherThing, String> getThingDoer() {
return Things.getSomeOtherThingDoer();
}
}
abstract . Java , . , , Number , Integer , Integer Number.
a List<Integer> a List<Number>. , ThingDoer<T, String> ( T extends BaseThing), , ThingDoer<SomeThing, String> ThingDoer<SomeOtherThing, String>, T, SomeThing SomeOtherThing BaseThing.
( API) , T, . , ( , ) .
:
"" ( ) :
public abstract ThingDoer<? extends BaseThing, String> getThingDoer();
, ThingDoer , -, BaseThing ( , BaseThing), API.
№ 2. ...
OP:
BaseThing thing = ;
thing.getThingDoer().do(thing);
, thing , getThingDoer(). , getThingDoer(), thing ( OP). .
API BaseThing ThingDoer . API :
thing.doTheThing();
:
public class SomeThing extends BaseThing {
@Override public void doTheThing() {
Things.getSomeThingDoer().do(this);
}
}
public class SomeOtherThing extends BaseThing {
@Override public void doTheThing() {
Things.getSomeOtherThingDoer().do(this);
}
}