title: Why do we need variance if we already have type boundaries?
body: <p>If I write <code>Foo[_ &lt;: Bar]</code> or <code>Foo[+T &lt;: Bar]</code> what does the latter let me do, that I could not do with the former?</p>
  
  <p>Is it just convenience, so that can write <code>def bar: T</code> rather than <code>def bar: Bar</code>?</p>
  
  <p>In which context is it useful?</p>
  
  <p>Is it actually accurate to say that there is no variance in java? Can one not model it with <code>&lt;? extends Foo&gt;</code> and <code>&lt;? super Bar&gt;</code>?</p>