6

考虑:

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

我没有办法表达我的意思是XfromBar<X>而不是Foo.Xfoobar(X t)实现中。X除了在Bar或静态内部类 中重命名泛型参数之外,没有其他方法吗?

4

2 回答 2

9

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

  1. 约定很明确,如果可能,类型参数应该是一个字符长,而另一方面是其他类不应该有一个字符的名称。
  2. 如果您能够消除歧义,那么您将能够重命名X. Bar<X>换句话说,如果您有能力说您将有能力简单地使用类型参数foobar(TypeParameter.X t)以外的东西on 。重命名避免名称冲突的方法。XBarX

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

于 2012-01-21T17:44:52.123 回答
0

编译器甚至不会费心去确定你是否指的是 Foo.X,它会考虑 TypeParameter X,不管怎样,除非你输入如下内容:

public class Bar<X> {
    Foo<X> foo = new Foo<X>() {
        public void foobar(Foo.X t) {}
    };
}
于 2012-01-21T18:09:16.703 回答