To get an idea of how generics works check out this example:
List sfoo = new ArrayList();
List foo;
List extends Foo> tmp;
tmp = sfoo;
foo = (List) tmp;
The thing is, that wasn't designed for local/member variables, but for function signatures, that's why it's so ass-backwards.