泛型名称冲突

Lan*_*dei 6 java generics name-clash

考虑:

public interface Foo<T> {
    public static class X{}
    public void foobar(T t); 
}

public class Bar<X> {
    Foo<X> foo = new Foo<X>() {
        public void foobar(X t) {}
    };
}
Run Code Online (Sandbox Code Playgroud)

我发现没有办法表达,我的意思是XBar<X>,而不是Foo.Xfoobar(X t)执行.难道就没有其他办法比重命名泛型参数XBar或静态内部类?

Mar*_*ers 9

我认为没有办法消除类型参数的歧义,我认为这是一个合理的设计决策.

  1. 这些约定很清楚,如果可能的话,类型参数应该是一个字符长,另一方面,其他类不应该有一个字符的名称.
  2. 如果你有能力消除歧义,那么你就可以重命名类型参数XBar<X>.换句话说,如果你有能力说foobar(TypeParameter.X t)你可以简单地使用除了X类型参数之外的东西Bar.重命名X 避免名称冲突的方式.

不要忘记,类型参数名称不会以琐碎的方式泄露给其他类.永远不会被迫使用某种类型的参数名称.因此,语言设计者不会认为值得为语言增加复杂性是有道理的.