考虑:
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
或静态内部类之外,没有其他方法吗?
我认为没有办法消除类型参数的歧义,我认为这是一个合理的设计决策。
- 约定很清楚,如果可能的话,类型参数应该是一个字符长,而另一方面,其他类不应该有一个字符的名称
- 如果您能够消除歧义,则可以在
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) {}
};
}