49

I have a generic class:

public class ListObject<T>
{
    // fields
    protected T _Value = null;
      // ..
}

Now I want to do something like the following:

ListObject<MyClass> foo = new ListObject<MyClass>();
ListObject<MyClass> foo2 = new ListObject<MyClass>();
foo.compareTo(foo2);

Question:

How can I define the compareTo() method with resprect to the generic T?

I guess I have to somehow implement a constraint on the generic T, to tell that T implements a specific interface (maybe Comparable, if that one exists).

Can anyone provide me with a small code sample?

4 Answers 4

62

Read also the discussion here: Generics and sorting in Java

Short answer, the best you can get is:

class ListObject<T extends Comparable<? super T>> {
    ...
}

But there is also reason to just use:

class ListObject<T extends Comparable> {
    ...
}
Sign up to request clarification or add additional context in comments.

2 Comments

I'll stick to ListObject<T extends Comparable> for the moment.
Also check the related thread: stackoverflow.com/questions/2064169/…, which discusses the need for wildcard of form:<? super T>
5

This depends on exactly what you want the compareTo method to do. Simply defining the compareTo method to take other ListObject<T> values is done by the following

public class ListObject<T> {
  public int compareTo(ListObject<T> other) {
    ...
  }
}

However if you want to actually call methods on that parameter you'll need to add some constraints to give more information about the T value like so

class ListObject<T extends Comparable<T>> {
  ...
}

Comments

4

Try public class ListObject<T extends U>. Only Ts which implement U (or derive from U) will be allowable substitutions.

2 Comments

Gives me a compiler error. Even with such a simple TestClass: public class ConstraintTest<T implements Comparable> { } Syntax error on token "implements",, expected What am I missing?
@citronas: It's actually extends even for interfaces. Do note that if you use a base class with the extends attribute, you can actually add the base class directly to the generified object anymore, that's the biggest (and worst) side effect of the generics extension.
-3
public class ListObject<T implements Comparable> {...}

1 Comment

-1 Voted down because Comparable without the type parameter is a raw type which u shouldn't use with Java 1.5+

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.