Why use generics?

Generics are often required for type safety, but they have more benefitsthan just allowing your code to run:

  • Properly specifying generic types results in better generated code.
  • You can use generics to reduce code duplication.

If you intend for a list to contain only strings, you candeclare it as List<String> (read that as “list of string”). That wayyou, your fellow programmers, and your tools can detect that assigning a non-string tothe list is probably a mistake. Here’s an example:

  1. var names = List<String>();
  2. names.addAll(['Seth', 'Kathy', 'Lars']);
  3. names.add(42); // Error

Another reason for using generics is to reduce code duplication.Generics let you share a single interface and implementation betweenmany types, while still taking advantage of staticanalysis. For example, say you create an interface forcaching an object:

  1. abstract class ObjectCache {
  2. Object getByKey(String key);
  3. void setByKey(String key, Object value);
  4. }

You discover that you want a string-specific version of this interface,so you create another interface:

  1. abstract class StringCache {
  2. String getByKey(String key);
  3. void setByKey(String key, String value);
  4. }

Later, you decide you want a number-specific version of thisinterface… You get the idea.

Generic types can save you the trouble of creating all these interfaces.Instead, you can create a single interface that takes a type parameter:

  1. abstract class Cache<T> {
  2. T getByKey(String key);
  3. void setByKey(String key, T value);
  4. }

In this code, T is the stand-in type. It’s a placeholder that you canthink of as a type that a developer will define later.