2011-10-19 14 views
7

Implemento la interfaz Map<V,K> y Collection<V> en una clase, pero el método remove(Object) se produce en ambas interfaces, por lo que eclipse me muestra algunos errores. Los tipos de devolución son diferentes, uno devuelve boolean y el otro V pero eso no parece importar.Java anulando dos interfaces, clash of method names

¿Hay alguna forma de decirle a java/eclipse qué método está siendo anulado?

EDIT: Tengo una interfaz que todos los valores deben implementar, proporciona el valor con un método getKey(), lo que permite escribir una función de agregar para el mapa. ¿Pero parece que no hay forma de que esta clase se vea como un mapa y una colección al mismo tiempo?

+0

Es posible que desee decir lo que tiene la intención de hacer. Un 'Mapa' es fundamentalmente un diccionario de clave-valor. Una 'Colección' es solo un montón de cosas. No son conceptualmente lo mismo en absoluto. ¿Quiere decir que quiere un 'Mapa' cuyas * claves * se puede acceder como una' Colección'? Porque 'keySet()' hace eso, por ejemplo. –

Respuesta

8

No, no hay una manera directa.

En realidad, el enlace dinámico tiene en cuenta la firma que excluye el tipo de devolución, por lo que el compilador de Java no puede aceptar los dos métodos para la misma clase que tienen la misma firma pero diferentes tipos de devolución. Si dos métodos tienen los mismos nombres y los mismos parámetros, DEBEN también tener el mismo tipo de devolución, desafortunadamente para usted.

La única forma es dividir el comportamiento en dos clases diferentes y componerlas. Tal vez un método como Collection<V> asCollection() o algo así.

+0

Aquí está la documentación de JLS con respecto a la firma del método: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

No, no hay una manera de resolver tales conflictos.

Debería considerar usar composition y delegation en lugar de herencia para al menos una de las dos interfaces, o puede dividir la funcionalidad de su clase en dos clases, realmente depende de su problema concreto.

+0

Si hago que mi clase Map extienda la clase Collection y establezca el método remove en la clase Collection, sigo recibiendo errores en la clase Map. ¿O cómo debería usar la composición? –

+0

Si hace que su "Colección de clase de mapa se extienda" está utilizando la herencia. Si lo que intenta hacer es esencialmente un Mapa con algunas diferencias personalizadas, haga que se extienda solo un Mapa, y si necesita una Colección internamente para alguna funcionalidad, puede declarar esa Colección como una variable privada, y también exponer algunas de los métodos necesarios, si es necesario, utilizando la delegación.Usted define un método que acaba de pasar la llamada en un método similar en su variable privada. – stivlo

+0

Gracias entiendo eso, pero cuando uso delegar mi clase pierde el aspecto de una colección real. Debería ser simple para las aplicaciones utilizar esta implementación sin preocuparse por tener que llamar a algunos métodos de Colection(). Pero esto parece ser imposible. –

1

El Map ya tiene keySet() que es la colección de llaves. ¿Por qué necesitas la Colección también? Si es así, solo haga dos métodos como asMap y asCollecton que devuelven tipos diferentes.

+0

Estoy escribiendo un método add() personalizado para el mapa. –

+0

¿Y? .. Siempre puedes hacer 'yourObject.asMap(). Add (.. custom ..)'. – kan

0

Probablemente necesite composición en lugar de herencia. Desafortunadamente, Java no tiene soporte de nivel de idioma para eso; me refiero a que se puede hacer pero es innecesariamente laborioso.

0

Necesita replantear su diseño. Fundamentalmente, un mapa es diferente a una colección. Piensa en el método Collection.add(). ¿Tiene algún sentido agregar un objeto sin una clave o una clave sin valor a un mapa?

Su mejor opción (creo y dependiendo de su aplicación) es implementar un mapa, pero cuando necesite una colección, use uno de sus métodos para obtener el conjunto de claves, valores o pares de valores clave.

+0

Mira mi edición, hay una interfaz que proporciona un método para obtener una clave de un valor. Sé lo que quiero hacer, la única pregunta es cómo :-) –

+0

'agregar' era solo un ejemplo. Mi comentario permanece – JeremyP