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 t开发者_Python百科he 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 thatT
must implement theComparable
interface that can compare twoT
instances. While<T extends Comparable>
meansT
implementsComparable
such that it can compare twoObject
s 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>>
1) the class has a type parameter T
with a bound (extends Comparable <T>
), this parameter is passed to the interface (which need the same bound here). When passing a type parameter, you must not repeat its bound - why you should do so?
2) like 1), the type parameter has its bound declared, no repeat neccessary.
To clarify:
The first type parameter occurence (here behind the interface or class name) is its declaration. Any following occurence is a usage. You even never would write a variables type declaration each time you use it, right?
"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?"
No, both will not be okay. Suppose I have a class Foo
which implements Comparable<Bar>
but classes Foo and Bar have no relation to each other. Then Foo
cannot compare to other objects of type Foo
. <T extends Comparable<T>>
will catch this as a problem. <T extends Comparable>
will not.
精彩评论