Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #28723 > unrolled thread
| Started by | Philipp Kraus <philipp.kraus@flashpixx.de> |
|---|---|
| First post | 2014-06-13 22:52 +0200 |
| Last post | 2014-06-14 08:41 -0400 |
| Articles | 5 — 3 participants |
Back to article view | Back to comp.lang.java.programmer
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
| From | Philipp Kraus <philipp.kraus@flashpixx.de> |
|---|---|
| Date | 2014-06-13 22:52 +0200 |
| Subject | Queue and Map interface |
| Message-ID | <lnfoa3$8sn$1@online.de> |
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.
Thanks a lot
Phil
[toc] | [next] | [standalone]
| From | Eric Sosman <esosman@comcast-dot-net.invalid> |
|---|---|
| Date | 2014-06-13 17:32 -0400 |
| Message-ID | <lnfql9$hnq$1@dont-email.me> |
| In reply to | #28723 |
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.
--
Eric Sosman
esosman@comcast-dot-net.invalid
[toc] | [prev] | [next] | [standalone]
| From | markspace <markspace@nospam.nospam> |
|---|---|
| Date | 2014-06-13 16:52 -0700 |
| Message-ID | <lng2sk$8k4$1@dont-email.me> |
| In reply to | #28724 |
On 6/13/2014 2:32 PM, Eric Sosman wrote:
> For even more "favoritism," you could have the outer class
> implement neither Map nor Queue, and delegate both those interfaces
> to inner classes.
>
Or just have two methods to call on some generic object which return a
"view" of that object as either a Map or a Queue.
interface MyCollection {
Map asMap();
Queue asQueue();
}
[toc] | [prev] | [next] | [standalone]
| From | Philipp Kraus <philipp.kraus@flashpixx.de> |
|---|---|
| Date | 2014-06-14 07:52 +0200 |
| Message-ID | <lngnu2$etd$1@online.de> |
| In reply to | #28724 |
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.
Thanks a lot for the idea, but I need first to redfine my classes for a
better code structure
Phil
[toc] | [prev] | [next] | [standalone]
| From | Eric Sosman <esosman@comcast-dot-net.invalid> |
|---|---|
| Date | 2014-06-14 08:41 -0400 |
| Message-ID | <lnhfus$jc7$1@dont-email.me> |
| In reply to | #28726 |
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
[toc] | [prev] | [standalone]
Back to top | Article view | comp.lang.java.programmer
csiph-web