泛型名称冲突

时间:2012-01-21 16:51:26

标签: 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) {}
    };
}

我发现无法表达我的意思X来自Bar<X>Foo.X来自foobar(X t)实施。除了重命名X中的泛型参数Bar或静态内部类之外,没有其他方法吗?

2 个答案:

答案 0 :(得分:9)

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

  1. 这些约定很清楚,如果可能的话,类型参数应该是一个字符长,另一方面是其他类不应该有一个字符的名称。
  2. 如果您有能力消除歧义,那么您就可以在X 中重命名类型参数Bar<X>。换句话说,如果您能够说出foobar(TypeParameter.X t),那么您就可以在X上使用Bar以外的其他内容作为类型参数。重命名X 避免名称冲突的方式。
  3. 不要忘记,类型参数名称不会以琐碎的方式泄露给其他类。您永远不会被迫使用某些类型的参数名称。因此,语言设计者不会认为值得为语言增加复杂性是有道理的。

答案 1 :(得分:0)

编译器甚至不愿意确定你是否意味着Foo.X,它会考虑TypeParameter X,除非你输入类似的内容:

public class Bar<X> {
    Foo<X> foo = new Foo<X>() {
        public void foobar(Foo.X t) {}
    };
}