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