Я знаю, что это вопрос C #, но дженерики используются и на других языках, и их использование / цели очень похожи.
В коллекциях Java используется обобщений , начиная с Java 1.5. Поэтому их лучше использовать, когда вы создаете свой собственный объект, похожий на коллекцию.
Примером, который я вижу почти везде, является класс Pair, который содержит два объекта, но должен обрабатывать эти объекты в общем виде.
class Pair<F, S> {
public final F first;
public final S second;
public Pair(F f, S s)
{
first = f;
second = s;
}
}
Всякий раз, когда вы используете этот класс Pair, вы можете указать, с какими объектами вы хотите, чтобы он имел дело, и любые проблемы приведения типов будут отображаться во время компиляции, а не во время выполнения.
Обобщения могут также иметь свои границы, определенные с ключевыми словами «super» и «extends». Например, если вы хотите иметь дело с универсальным типом, но хотите убедиться, что он расширяет класс с именем Foo (у которого есть метод setTitle):
public class FooManager <F extends Foo>{
public void setTitle(F foo, String title) {
foo.setTitle(title);
}
}
Хотя это и не очень интересно само по себе, полезно знать, что всякий раз, когда вы имеете дело с FooManager, вы знаете, что он будет обрабатывать типы MyClass и что MyClass расширяет Foo.