Re: Generics question
 
kelvSYC wrote:
Suppose I have a class Foo, which has subclasses Foo1 and Foo2.  Now,
suppose I need a map whose key type is Class<T extends Foo> and whose
value type is Set<T> (that is, if the key type is Foo1.class, then the
value type is Set<Foo1>).
Is it even possible to declare such a type using generics or do I have
to do something in a roundabout way?
I couldn't find a way to declare it directly.
Mark Space wrote:
I think so, give a certain assumptions about what you really want.  Try 
this method:
    public static <X extends Foo> Map<Class<X>,Set<X>> getFooMap() {
        return new HashMap<Class<X>,Set<X>>();
    }
It's somewhat roundabout, although not too much I think.  Then you can 
do the following.  The last line below is a compile time error.
        Map<Class<Foo>,Set<Foo>> foos = getFooMap();
        Map<Class<Foo1>,Set<Foo1>> foos1 = getFooMap();
        Map<Class<Foo2>,Set<Foo2>> foos2 = getFooMap();
        Map<Class<Foo1>,Set<Foo2>> foosX = getFooMap(); // oops
I came up with the same kind of method and a holder/factory class idiom:
   package testit;
   import java.util.HashMap;
   import java.util.Map;
   import java.util.Set;
   public class Generitor <T extends Foo>
   {
     private Map <Class <T>, Set <T>> generators =
             new HashMap <Class <T>, Set <T>> ();
     public static <F extends Foo> Map <Class <F>, Set <F>>
         makeGenerators()
     {
       return new HashMap <Class <F>, Set <F>> ();
     }
     public Map <Class <T>, Set <T>> getGenerators()
     {
       return this.generators;
     }
     public Map <Class <T>, Set <T>> newGenerators()
     {
       return new HashMap <Class <T>, Set <T>> ();
     }
   }
-- 
Lew