Channels ▼

Bil Lewis

Dr. Dobb's Bloggers

ClothingList implements Clothing, List? Not!

March 17, 2008

No language is perfect, but as languages go, Java comes as close as any I know. So what should one do when one likes a language a lot?

Criticize it!

One of Java's deficits is its lack of disambiguation of declared methods whose names conflict. Imagine you have a class, ClothingList that implements two interfaces, say List and Clothing. It's going to be a list of your closet contents, with the additional stipulation that the articles all fit you. (Yes, it's a kinda lame example. It's after midnight.) Both interfaces declare a method "size()". List.size() is of course intended to tell you the number of items in the list, while Clothing.size() is intended to tell you how big the articles are (medium, thank you).

What we really want is a way to implement both methods and then distinguish between them. Java doesn't do this. It assumes that if two interfaces both declare a method with the same signature, then clearly they must be intended to do the same thing. And should they declare a different return type, then Java will not let you implement both interfaces at all.

So this:

public class ClothingList implements Clothing, List {
public String size() {
return null;
}
}

interface Clothing {
String size();
}

interface List {
int size();
}

isn't even legal.

This leave us with an unpleasant decision to make. If we control the interface Clothing, then we can just change names. If we don't, then we really can't use that interface at all! We could do some crazy stuff with delegates, but calling outside methods that expect a Clothing item is going to be awkward. Been there. Done that. Didn't like it.

The point is that a language should support us in what we want to do. We shouldn't have to adjust our design to fit the language.

Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.
 


Video