2012-01-21 24 views
6

considerar:Genéricos nombre choque

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

he encontrado ninguna manera de expresar que me refiero a la X de Bar<X> y no Foo.X en la implementación foobar(X t). ¿No hay otra manera que cambiar el nombre del parámetro genérico X en Bar o la clase interna estática?

+2

Eso no se ve bien ... puede usted anidar una clase pública (incluso estática) dentro de una interfaz? –

+0

Sí, si cambia el nombre de la clase interna estática o el parámetro genérico de Bar, compila. – Landei

+2

@Daniel ... Sí, puedes. Parece gracioso, pero es completamente válido. –

Respuesta

9

No creo que haya una forma de desambiguar el parámetro tipo, y creo que esa fue una decisión de diseño razonable.

  1. Las convenciones son claras de que los parámetros de tipo deben ser de un carácter de largo si es posible, y la otra cara de esto es que las otras clases no deben tener nombres de un solo carácter.
  2. Si tuviera la capacidad de desambiguar, , entonces tendría la capacidad de cambiar el nombre del parámetro de tipo X en Bar<X>. En otras palabras, si tuviera la capacidad de decir foobar(TypeParameter.X t), podría simplemente usar algo que no sea X para el parámetro de tipo en Bar. Renombrar Xes la forma en que evita los conflictos de nombres.

No olvide que los nombres de los parámetros de tipo no se filtran a otras clases de manera más que trivial. Nunca se lo fuerza a utilizar un cierto nombre de parámetro de tipo. Por lo tanto, tiene sentido que los diseñadores de idiomas no pensaran que vale la pena agregar complejidad al lenguaje.

+0

Tiendo a estar de acuerdo con su segundo punto, pero no con el primero: la falta de sintaxis de Java para cosas bastante básicas como Closures o Tuples lo obliga a usar wrappers, y si trabaja en código confiando mucho en estos wrappers, comienza rápidamente para usar nombres como 'F' o' P' en lugar de 'Function' o' Product' (ver por ej. http://www.functionaljava.org). – Landei

0

el compilador incluso no molestan para determinar si nos referimos foo.x, se tendrá en cuenta la TypeParameter X, independientemente, a menos que ha escrito algo como:

public class Bar<X> { 
    Foo<X> foo = new Foo<X>() { 
     public void foobar(Foo.X t) {} 
    }; 
} 
+0

No, eso no es cierto. Dentro de la clase anónima estamos en el ámbito de la clase 'Foo', por lo que' Foo.X' sombrea el parámetro de tipo 'X' de la clase externa. – Landei

Cuestiones relacionadas