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
    等名称,而不是
    函数
    产品
    (参见示例)。