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.
In the declaration
maxStackclass<T extends Comparable <T>>you have already expressed the bounds onT. So you do not need it again.Reason same as above. No need to specify bounds on the same type parameter again.
<T extends Comparable<T>>means thatTmust implement theComparableinterface that can compare twoTinstances. While<T extends Comparable>meansTimplementsComparablesuch that it can compare twoObjects in general. The former is more specific.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>>