Я понимаю, что указание дисперсии для генериков в С# происходит на уровне объявления типа: когда вы создаете свой общий тип, вы указываете дисперсию для аргументов типа. В Java, с другой стороны, указывается дисперсия, в которой используется общий тип: при создании переменной какого-то общего типа вы указываете, как могут варьироваться аргументы своего типа.
Каковы плюсы и минусы для каждого варианта?