Java generics: multiple generic parameters?
Solution 1:
Yes - it's possible (though not with your method signature) and yes, with your signature the types must be the same.
With the signature you have given, T
must be associated to a single type (e.g. String
or Integer
) at the call-site. You can, however, declare method signatures which take multiple type parameters
public <S, T> void func(Set<S> s, Set<T> t)
Note in the above signature that I have declared the types S
and T
in the signature itself. These are therefore different to and independent of any generic types associated with the class or interface which contains the function.
public class MyClass<S, T> {
public void foo(Set<S> s, Set<T> t); //same type params as on class
public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}
You might like to take a look at some of the method signatures of the collection classes in the java.util
package. Generics is really rather a complicated subject, especially when wildcards (? extends
and ? super
) are considered. For example, it's often the case that a method which might take a Set<Number>
as a parameter should also accept a Set<Integer>
. In which case you'd see a signature like this:
public void baz(Set<? extends T> s);
There are plenty of questions already on SO for you to look at on the subject!
- Java Generics: List, List<Object>, List<?>
- Java Generics (Wildcards)
- What are the differences between Generics in C# and Java... and Templates in C++?
Not sure what the point of returning an int
from the function is, although you could do that if you want!
Solution 2:
You can declare multiple type variables on a type or method. For example, using type parameters on the method:
<P, Q> int f(Set<P>, Set<Q>) {
return 0;
}