Java 泛型名称冲突
考虑:Java 泛型名称冲突,java,generics,name-clash,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) {} }; } 公共接口Foo{ 公共静态类X{} 公共图书馆(T); } 公共类酒吧{
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) {}
};
}
公共接口Foo{
公共静态类X{}
公共图书馆(T);
}
公共类酒吧{
Foo Foo=新Foo(){
公共void foobar(X t){}
};
}
我找不到方法来表达我指的是
Bar
中的X
,而不是foobar(xt)
实现中的Foo.X
。除了重命名Bar
中的泛型参数X
或静态内部类之外,没有其他方法了吗 我认为没有办法消除类型参数的歧义,我认为这是一个合理的设计决策
Bar
中重命名类型参数X
。换句话说,如果您能够说foobar(TypeParameter.X t)
,那么您就可以简单地使用X
以外的内容作为Bar
上的类型参数。重命名X
是避免名称冲突的方法别忘了,类型参数名不会以更简单的方式泄漏到其他类。您永远不会被迫使用某个类型参数名。所以,语言设计者不会认为这值得增加语言的复杂性。 编译器甚至不去确定你是否意味着fo.x,无论如何,它会考虑Type参数X,除非你输入了类似的东西:
public class Bar<X> {
Foo<X> foo = new Foo<X>() {
public void foobar(Foo.X t) {}
};
}
公共类栏{
Foo Foo=新Foo(){
公共void foobar(Foo.X t){}
};
}
这看起来不对。。。你能在接口中嵌套一个公共类(甚至是静态的)吗?是的,如果你重命名静态内部类或Bar的泛型参数,它就会编译。@Daniel。。。是的,你可以。这看起来很有趣,但完全正确。不,那不是真的。在匿名类中,我们处于类Foo
的范围内,因此Foo.X
隐藏了外部类的类型参数X
。我倾向于同意您的第二点,但不同意第一点:Java缺少闭包或元组等非常基本的语法,这迫使您使用包装器,而且,如果您在编写代码时严重依赖这些包装器,您很快就会开始使用F
或P
等名称,而不是函数
或产品
(参见示例)。