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.
No comments:
Post a Comment