If you want to return anything in Java, you usually use Object – with Java 5 and autoboxing, this even allows to return primitive types.
But with Generics, you can do better: You can return whatever the caller wants.
How? Like so:
public <T> T get() { @SuppressWarnings( "unchecked" ) T result = (T) ...calculate the result...; return result; }
Use cases: Calling unknown methods or reading field values with the Reflection API. Instead of cluttering your code with casts, just write (where ReflectionUtils.invokeMethod() uses the trick above):
Map<String, List<Map<String, String>> map = Maps.newHashMap(); Set<List<Map<String, String>> entries = ReflectionUtils.invokeMethod( map, "entrySet" );
Cool, eh?
Unfortunately, Sun’s javac isn’t smart enough to determine a common upper bound between int and Object. So if you need to return int, you still need a cast:
Map<String, List<Map<String, String>> map = Maps.newHashMap(); int size = ReflectionUtils.invokeMethod( map, "size" );