泛型名称冲突



考虑:

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

我找不到任何方式来表示我指的是来自Bar<X>X,而不是foobar(X t)实现中的Foo.X。除了重命名Bar中的泛型参数X或静态内部类之外,没有其他方法吗?

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

  1. 约定很清楚,如果可能的话,类型参数应该是一个字符长,而另一方面,其他类不应该有一个字符的名称
  2. 如果您能够消除歧义,则可以在Bar<X>中重命名类型参数X。换句话说,如果您能够说出foobar(TypeParameter.X t),那么您就可以简单地将X以外的内容用于Bar上的类型参数。重命名X是避免名称冲突的方法

别忘了,类型参数名称不会以微不足道的方式泄露给其他类。您永远不会被迫使用特定的类型参数名称。因此,语言设计者不会认为这值得为语言增加复杂性,这是有道理的。

编译器甚至不会费心确定你是否指的是Foo.X,它会考虑TypeParameter X,不管怎样,除非你键入了这样的东西:

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

相关内容

  • 没有找到相关文章

最新更新