genericsに関しての質問。

public class Foo<T>{
public void baz(){
Foo f;
Foo[] fs;
f = new Foo();
fs = new Foo[2];
}
}
これはコンパイル通るのに、

public class Foo<T>{
public class Bar{
public Bar(){}
}
public void baz(){
Bar b;
Bar[] bs;
b = new Bar();
bs = new Bar[2];
}
}
これだと 「汎用配列を作成します。」って言われてコンパイル時エラーに
なるのが納得いかないんだけど。
Foo<T>.Bar型の配列が「汎用配列」として弾かれているのだとしたら
前者のFoo<T>型の配列がコンパイル通るのは何故。

また、「b = new Bar(); 」ではエラーが出ずに
「bs = new Bar[2]; 」の方だけがエラーになってるのは不条理な気がするんだが。