语法<t extends =“”class <t =“”>&gt;在Java </t>

时间:2011-09-02 11:21:53

标签: java generics syntax

我对以下内容有几点想法:

public interface MaxStack<T extends Comparable <T>>

1 - 为什么实现MaxStack的类应该这样写:

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

而不是public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T extends Comparable <T>>

2-为什么当我使用泛型时,这个类的私有变量只能用<T>编写,而不能用<T extnds Comparable<T>>编写?例如,private List<T> stack= new ArrayList<T>();

3 - <T extends Comparable<T>><T extends Comparable>之间的区别是什么 - 如果我需要比较班级中的四个元素,那么两者都是O.K,不是吗?

编辑:我认为3的问题在于它可能允许插入以第二种方式定义的列表,以便具有不同的元素,这些元素都可以从可比较的方面扩展,然后当我想比较它们时,它赢了“因为我们无法将String与Integer进行比较,所以都可以从Comparable扩展。

4 个答案:

答案 0 :(得分:9)

  1. 在声明maxStackclass<T extends Comparable <T>>中,您已经表达了T的界限。所以你不需要它了。

  2. 与上述相同的原因。无需再次在同一类型参数上指定边界。

  3. <T extends Comparable<T>>表示T必须实现可以比较两个Comparable实例的T接口。虽然<T extends Comparable>表示T实现了Comparable,但它通常可以比较两个Object。前者更具体。

  4.   

    如果我需要比较班上的各种元素,两者都是O.K,   没有?

    嗯,从技术上讲,可以使用两者来实现相同的结果。但是对于声明<T extends Comparable>,它将涉及不必要的强制转换,您可以避免使用类型safe <T extends Comparable<T>>

答案 1 :(得分:2)

1)该类有一个带有绑定(T)的类型参数extends Comparable <T>,该参数被传递给接口(这里需要相同的绑定)。传递类型参数时,您不能重复它的约束 - 为什么要这样做?

2)如1),type参数声明了它的绑定,没有重复必要。

澄清:

第一个类型参数出现(在接口或类名后面)是它的声明。任何以下出现都是一种用法。你每次使用它时都不会写一个变量类型声明,对吗?

答案 2 :(得分:2)

“3 - <T extends Comparable<T>><T extends Comparable>之间有什么区别 - 如果我需要比较班级中的四个元素,那么两者都是O.K,不是吗?”

不,两者都不会好的。假设我有一个Fooimplements Comparable<Bar>,但是类Foo和Bar彼此没有关系。然后Foo无法与Foo类型的其他对象进行比较。 <T extends Comparable<T>>会将此视为问题。 <T extends Comparable>不会。

答案 3 :(得分:-1)

<T extends Comparable<? super T>>

更多详情here