Это не избыточно.Со статическим интерфейсом:
MyClass.MyInterface<String> myInstance;
и нестатическим классом innter (интерфейс всегда статичен):
MyClass<String>.MyInterface myInstance;
Более реальный пример:
Map<String, Integer> map = ...;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
...
}
Преимущество статического подхода заключается в том, что вы можете импортировать вложенный тип и при этом указать параметры типа:
class ClassWithAReallyLongName<T> {
static interface Entry<T> {
}
}
и
import my.package.ClassWithAReallyLongName.Entry;
class Foo {
Entry<String> bar;
}
, хотя следует использовать эту идиомус осторожностью, чтобы не запутать читателя.