考虑:
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
或静态内部类之外,没有其他方法吗?
答案 0 :(得分:9)
我认为没有办法消除类型参数的歧义,我认为这是一个合理的设计决策。
X
中重命名类型参数Bar<X>
。换句话说,如果您能够说出foobar(TypeParameter.X t)
,那么您就可以在X
上使用Bar
以外的其他内容作为类型参数。重命名X
是避免名称冲突的方式。不要忘记,类型参数名称不会以琐碎的方式泄露给其他类。您永远不会被迫使用某些类型的参数名称。因此,语言设计者不会认为值得为语言增加复杂性是有道理的。
答案 1 :(得分:0)
编译器甚至不愿意确定你是否意味着Foo.X,它会考虑TypeParameter X,除非你输入类似的内容:
public class Bar<X> {
Foo<X> foo = new Foo<X>() {
public void foobar(Foo.X t) {}
};
}