Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implement both Map and List interface in Java?

I'd like to have an object that implements both the Map and the List interfaces in Java. The idea is similar to the problem in this question: Java Ordered Map

I want to add name/value pairs to a list and have the list preserve the sequence, but also be able to do lookups by name:

foo.put("name0", "value0");
foo.put("name1", "value1");
foo.get(1); --> Map.Entry("name1", "value1")
foo.get("name0"); --> "value0"

Here's the problem: when I create this class:

class Foo implements Map, List {
    // add all methods here
}

I get a compile error:

"The return type is incompatible with Map.remove(Object)"
public boolean remove(Object o) {
    return false;
}

If I don't implement the Map and List interfaces, then there are lots of Java collections methods that aren't available to use on this data structure.

(Also, the reason that the solution proposed in Java Ordered Map above doesn't work is that LinkedHashMap doesn't have a get(int) method. Can't select entries by index.)

like image 754
ccleve Avatar asked Nov 18 '10 19:11

ccleve


People also ask

Can multiple interfaces be implemented in Java?

Java does not support "multiple inheritance" (a class can only inherit from one superclass). However, it can be achieved with interfaces, because the class can implement multiple interfaces. Note: To implement multiple interfaces, separate them with a comma (see example below).

Does stack implement Map interface in Java?

Full Stack Java Developer CourseTreeMap class implements the SortedMap interface that extends the Map interface.

Are List Set Map interface?

List is an interface, and ArrayList is the typically used class that implements List. Likewise, Set is an interface, and HashSet is the commonly used class that implements Set.

Which is the implementation of the List interface?

The implementation classes of List interface are ArrayList, LinkedList, Stack and Vector. The ArrayList and LinkedList are widely used in Java programming.


2 Answers

It should be pointed out that the reason for the error is that Map contains the definition for the following remove method:

V remove(Object key)

While List defines:

boolean remove(Object o) 

And, in Java, methods cannot be overloaded based on their return type, so they are conflicting signatures, and cannot be implemented in the same class.

like image 104
jjnguy Avatar answered Sep 20 '22 12:09

jjnguy


As you noticed you cannot implement both List and Map on the same class. But for what you need that should also not be necessary. What you need is that the data can be accessed by both a Map and a List interface. A bit like accessing Map data as a set in entrySet() or as a Collection using Map.values().

In short, what you need is 2 views on the data, one view implementing a List and another view implementing Map.

If there is one view dominant (for example Map) then you could give your map implementation a method List getAsList() which presents the data as a List, backed by the data of the Map.

EDIT

The answer given by Paulo Guedes should serve you. There already is a Map implementation with your requirements. My answer is a bit more general, about presenting the same data using multiple incompatible interfaces where a simple Adapter is not enough.

like image 35
extraneon Avatar answered Sep 22 '22 12:09

extraneon