Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #28729

Re: Queue and Map interface

From Eric Sosman <esosman@comcast-dot-net.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: Queue and Map interface
Date 2014-06-14 08:41 -0400
Organization A noiseless patient Spider
Message-ID <lnhfus$jc7$1@dont-email.me> (permalink)
References <lnfoa3$8sn$1@online.de> <lnfql9$hnq$1@dont-email.me> <lngnu2$etd$1@online.de>

Show all headers | View raw


On 6/14/2014 1:52 AM, Philipp Kraus wrote:
> On 2014-06-13 21:32:20 +0000, Eric Sosman said:
>
>> On 6/13/2014 4:52 PM, Philipp Kraus wrote:
>>> Hello,
>>>
>>> I would like to create a class which implements a Map and a Queue with
>>>
>>> class myMapQueue<A,B> extends myAbstractClass implements Map<A,B>,
>>> Queue<B> {}
>>>
>>> The problem is the remove(Object) method, because the method is defined
>>> in the Queue and the Map
>>> interface in the Queue with boolean remove(Object) and in the Map with V
>>> remove(Object), so I get
>>> a "clash error". How can I solve this problem.
>>
>>      "Favor composition over inheritance." -- Bloch
>>
>>      In short, I don't believe you can do what you want -- not in the
>> way you want to do it.  An alternative might be to implement Map<A,B>
>> in an outer class, one that also contains a Queue<B> implementation as
>> an inner class.  The outer class would also have a getQueue() method
>> to return an instance of the inner class -- whether that's a new
>> instance created on the fly or a single instance that's created once
>> per outer class is up to you.
>>
>>      For even more "favoritism," you could have the outer class
>> implement neither Map nor Queue, and delegate both those interfaces
>> to inner classes.
>
> Thanks you both for the idea, but it is not nice to do this with
> different inner structures, because
> I need on the class the interface of Map and Queue, because an object of
> myMapQueue should
> use with the Java Map or Queue structure. On the idea:
>
> class myMapQueue<K,V> {
>
>      private myMap implements Map<K,V> {}
>      private Queue implements Queue<V> {}
>
>      public Map<K,V> getMap() {}
>      public Queue<V> getQueue() {}
>
> }
>
> I need always the getMap or getQueue call before I can use the internal
> datastructure.

     You've already discovered that Map and Queue are incompatible,
hence no class can implement both of them.  That is, there can be
no single object that is simultaneously a Map and a Queue.  That
being so, you will need an intermediary of some kind to produce
whichever view -- Queue or Map -- is needed for each use.

> Thanks a lot for the idea, but I need first to redfine my classes for a
> better code structure

     Perhaps if you described the larger problem you're trying to
solve, somebody might have ideas about alternative approaches.

     (Idle anecdote: At a job interview I was once asked how to
implement something rather similar, a blend of Map and PriorityQueue.
I didn't come up with a real solution -- but I got the job anyhow.)

-- 
Eric Sosman
esosman@comcast-dot-net.invalid

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

Queue and Map interface Philipp Kraus <philipp.kraus@flashpixx.de> - 2014-06-13 22:52 +0200
  Re: Queue and Map interface Eric Sosman <esosman@comcast-dot-net.invalid> - 2014-06-13 17:32 -0400
    Re: Queue and Map interface markspace <markspace@nospam.nospam> - 2014-06-13 16:52 -0700
    Re: Queue and Map interface Philipp Kraus <philipp.kraus@flashpixx.de> - 2014-06-14 07:52 +0200
      Re: Queue and Map interface Eric Sosman <esosman@comcast-dot-net.invalid> - 2014-06-14 08:41 -0400

csiph-web