Numerator Numerator - 5 months ago 17
Java Question

The syntax <T extends Class<T>> in Java

I have couple of thoughts regarding the following:

public interface MaxStack<T extends Comparable <T>>


1-Why does the class that implements
MaxStack
should be written like this:

public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T>


and not
public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T extends Comparable <T>>
?

2- why do the private variables of this class, when I use generics, should be written only with
<T>
and not with
<T extnds Comparable<T>>
? For example,
private List<T> stack= new ArrayList<T>();


3-What is the difference between
<T extends Comparable<T>>
and
<T extends Comparable>
- if I need to compare bewteen elements in my class, both will be O.K, no?

Edit: I think that thee problem with 3 is that maybe it allows to insert of a list that was defined in the second way to have different elements which all extends from comparable and then when I want to compare them, it won't be possible, since we can't compare String to Integer, both extend from Comparable.

Answer
  1. In the declaration maxStackclass<T extends Comparable <T>> you have already expressed the bounds on T. So you do not need it again.

  2. Reason same as above. No need to specify bounds on the same type parameter again.

  3. <T extends Comparable<T>> means that T must implement the Comparable interface that can compare two T instances. While <T extends Comparable> means T implements Comparable such that it can compare two Objects in general. The former is more specific.

if I need to compare bewteen elements in my class, both will be O.K, no?

Well, technically you can achieve the same result using both. But for the declaration <T extends Comparable> it will involve unnecessary casts which you can avoid using the type safe <T extends Comparable<T>>