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?

Original source

Related problems