What is the difference between 'E', 'T', and '?' for Java generics?
I come across Java code like this:
public interface Foo<E> {}
public interface Bar<T> {}
public interface Zar<?> {}
What is the difference among all three of the above and what do they call this type of class or interface declarations in Java?
Solution 1:
Well there's no difference between the first two - they're just using different names for the type parameter (E
or T
).
The third isn't a valid declaration - ?
is used as a wildcard which is used when providing a type argument, e.g. List<?> foo = ...
means that foo
refers to a list of some type, but we don't know what.
All of this is generics, which is a pretty huge topic. You may wish to learn about it through the following resources, although there are more available of course:
- Java Tutorial on Generics
- Language guide to generics
- Generics in the Java programming language
- Angelika Langer's Java Generics FAQ (massive and comprehensive; more for reference though)
Solution 2:
It's more convention than anything else.
-
T
is meant to be a Type -
E
is meant to be an Element (List<E>
: a list of Elements) -
K
is Key (in aMap<K,V>
) -
V
is Value (as a return value or mapped value)
They are fully interchangeable (conflicts in the same declaration notwithstanding).