Java generics: multiple generic parameters?
generics, java, parameters
Solution
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!
Problem
I was wondering if it's possible to write a function that accepts multiple generic types as follows: ``` public int void myfunction(Set<T> a, Set<T> b) { return 5; } Set<Integer> setA = new HashSet<Integer>(); Set<String> setB = new HashSet<String>(); int result = myfunction(setA, setB); ``` Will that work? Does the generic in each parameter mean that each parameter must have the same type T that's generic?