title: How does Java's use-site variance compare to C#'s declaration site variance?
body: <p>My understand is that specifying variance for generics in C# happens at the type declaration level: when you're creating your generic type, you specify the variance for the type arguments. In Java, on the other hand, variance is specified where a generic is used: when you create a variable of some generic type, you specify how its type arguments can vary.</p>
  
  <p>What are the pros and cons to each option?</p>