Home Java Generics Wildcarding With Multiple Classes

# Java Generics Wildcarding With Multiple Classes

Alex Beardsley
1#
Alex Beardsley Published in 2009-04-13 23:21:54Z
 I want to have a Class object, but I want to force whatever class it represents to extend class A and implement interface B. I can do: Class  Or: Class  but I can't do both. Is there a way to do this?
Eddie
2#
 Actually, you can do what you want. If you want to provide multiple interfaces or a class plus interfaces, you have to have your wildcard look something like this:   See the Generics Tutorial at sun.com, specifically the Bounded Type Parameters section, at the bottom of the page. You can actually list more than one interface if you wish, using & InterfaceName for each one that you need. This can get arbitrarily complicated. To demonstrate, see the JavaDoc declaration of Collections#max, which (wrapped onto two lines) is: public static > T max(Collection coll)  why so complicated? As said in the Java Generics FAQ: To preserve binary compatibility. It looks like this doesn't work for variable declaration, but it does work when putting a generic boundary on a class. Thus, to do what you want, you may have to jump through a few hoops. But you can do it. You can do something like this, putting a generic boundary on your class and then: class classB { } interface interfaceC { } public class MyClass { Class variable; }  to get variable that has the restriction that you want. For more information and examples, check out page 3 of Generics in Java 5.0. Note, in , the class name must come first, and interfaces follow. And of course you can only list a single class.
 You can't do it with "anonymous" type parameters (ie, wildcards that use ?), but you can do it with "named" type parameters. Simply declare the type parameter at method or class level. import java.util.List; interface A{} interface B{} public class Test> { T t; }