Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java generics: multiple generic parameters?

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?

like image 673
atp Avatar asked Nov 18 '09 22:11

atp


People also ask

Can a generic class have multiple generic parameters Java?

A Generic class can have muliple type parameters.

Can generics take multiple type parameters?

Multiple parametersYou can also use more than one type parameter in generics in Java, you just need to pass specify another type parameter in the angle brackets separated by comma.

How many type parameters can a generic class introduce?

Generic Classes As with generic methods, the type parameter section of a generic class can have one or more type parameters separated by commas. These classes are known as parameterized classes or parameterized types because they accept one or more parameters.


2 Answers

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!

like image 173
oxbow_lakes Avatar answered Sep 21 '22 03:09

oxbow_lakes


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; } 
like image 43
erickson Avatar answered Sep 18 '22 03:09

erickson