109

What is the syntax for explicitly giving the type parameters for a generic Java method?

3 Answers 3

105

The following is not the syntax

<ArgType>genericMethod() 

It seems the type arguments must come after a dot as in

SomeClass.<ArgType>genericMethod() this.<ArgType>genericMethod() p.<ArgType>genericMethod() super.<ArgType>genericMethod() SomeClass.super.<ArgType>genericMethod() SomeClass.this.<ArgType>genericMethod() 
Sign up to request clarification or add additional context in comments.

5 Comments

How would this work for an import static method? It's not attached to a class or this, and as you state the first syntax listed does not work.
@Coderer Well the static method must be in some class, so you can use SomeClass.<ArgType>genericMethod(). If you didn't import the class, then you use the FQN of the class. I'm sure you know this and were hoping for a more satisfying answer. Personally I don't see why the <ArgType>genericMethod() syntax couldn't be added to the language; does it create an ambiguity?
I actually hadn't tried the FQN of the class, I just switched from import static pack.MyClass.someMethod; someMethod(); to import pack.MyClass; MyClass.<ArgType>someMethod(), but of course it's still more verbose than the "wish this worked" counterexample you give in the answer.
This is called type witness.
Yes. Sometimes type arguments are called type witnesses. That's good to know, and I hadn't known it before. The JLS uses the term type argument. The Generics trail of the Java tutorial sometimes use type argument and sometimes uses type witness.
89

According to the Java specification that would be for example:

Collections.<String>unmodifiableSet() 

(Sorry for asking and answering my own question - I was just looking this up for the third time. :-)

Comments

3

A good example from java.util.Collection of specifying a generic method which defines its own generic type is Collection.toArray where the method signature looks like:

<T> T[] toArray(T[] a); 

This declares a generic type T, which is defined on method call by the parameter T[] a and returns an array of T's. So the same instance could call the toArray method in a generic fashion:

Collection<Integer> collection = new ArrayList<Integer>(); collection.add(1); collection.add(2); // Call generic method returning Integer[] Integer[] ints = collection.toArray(new Integer[]{}); // Call generic method again, this time returning an Number[] (Integer extends Number) Number[] nums = collection.toArray(new Number[]{}); 

Also, see the java tutorial on generic type parameters.

1 Comment

Perhaps you could expand this with the part about explicitly giving a type parameter to a call (compare my answer). Then it would be a good canonical answer; as it is it doesn't even answer the question, since the parameter is deduced implicitly by the compiler in the call. :-)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.