Here's a little generics problem, in the form of some code:
package generics.question;
// We have a hierarchy of specialized subtypes of feature.
class Feature {
}
class SpecialFeature extends Feature {
}
// Features of a given kind are accessed through containers
interface Container<T extends Feature> {
public Iterable<T> foos();
}
class SpecialContainer implements Container<SpecialFeature> {
public Iterable<SpecialFeature> foos() {
return null;
}
}
// We want to draw features in various specialized ways.
interface Renderer<V extends Feature> {
public void render(Iterable<V> foos);
}
class SpecialRenderer implements Renderer<SpecialFeature> {
public void render(Iterable<SpecialFeature> foos) {
// render Subfoo objects
}
}
// Which renderer we use for a given container of features gets
// configured at runtime. This holds the mapping between renderers
// and containers.
interface RendererMap {
Renderer<? extends Feature> getRendererFor(Container<? extends Feature> container);
}
class RenderingScheduler {
RendererMap rendererMap;
public void render(Iterable<Container<? extends Feature>> containers) {
for (Container<? extends Feature> container : containers) {
Renderer<? extends Feature> renderer = rendererMap.getRendererFor(container);
// The following line produces a compile error:
// The method render(Iterable<capture#3-of ? extends Feature>) in
// the type Renderer<capture#3-of ? extends Feature> is not
// applicable for the arguments (Iterable<capture#4-of ? extends
// Feature>)
renderer.render(container.foos());
// this works, but... ug.
// How are these type parameters helping me again?
Renderer<Feature> r = (Renderer<Feature>)renderer;
Iterable<Feature> foos = (Iterable<Feature>)container.foos();
r.render(foos);
}
}
}
Update: Solution! ...and generics hurt my head some more.




R Bloggers
No comments:
Post a Comment