开发者

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.


  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>>


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜