Java Generics方法结构说明

时间:2014-05-28 11:14:53

标签: java generics

我试图学习java泛型,来自here我得到了下面的方法定义,这可以解释为什么我们在返回类型之前声明<T extends Comparable<T>>

public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem)

我知道Comparable接口的用法,但为什么我们在方法的返回类型之前需要这个<T extends Comparable<T>>

相反,我们可以像public static int countGreaterThan(T[] anArray, T elem)一样编写,它也将采用通用参数

所以我的问题是为什么我们需要<T extends Comparable<T>>或只需<T>

8 个答案:

答案 0 :(得分:1)

它只是表示通用类型T必须扩展Comparable<T>。通过告诉编译器,您的T对象将具有Comparable<T>的所有公共方法。

答案 1 :(得分:1)

Comparable<T>是一个接口,其合约意味着&#34;我们可以将此对象与T&#34;类型的对象进行比较。如果对象本身属于该类型T,则该对象与其自身相当。这是我们在这里所希望的行为。类似行为的示例是Integer,它实现了Comparable<Integer>

此处,此方法要求您传入与自身相当的对象。

如果这些对象属于T类型,那么它们必须实现Comparable<T>才能相互比较。由于泛型扩展/实现约束在所有情况下都使用关键字extends,因此泛型声明为T extends Comparable<T>

答案 2 :(得分:1)

该方法采用一系列项目和一个项目,我想从名称中它将返回anArray中“大于”elem的项目数。

这适用于具有明确定义的“大于”关系的任何类型T,即任何类型Comparable的自身,这正是<T extends Comparable<T>>所表达的 - 任何类型T只要该类型是Comparable的实现,其目标类型本身就是其类型参数。

答案 3 :(得分:1)

为了能够访问:compareTo(T o);我们必须扩展Comparable interface

为什么,因为只有当我们这样做时才能访问它,因为事先并不可用。

enter image description here

维基百科有一篇关于Generics in Java.

的优秀文章

答案 4 :(得分:1)

它限制T必须是实现Comparable的类,以便T的实例可以与T的另一个实例进行比较

答案 5 :(得分:1)

countGreaterThan方法是一种通用方法,需要将对象与其类型的另一个对象进行比较。 compareTo(Comparable接口)方法提供了实现Comparable接口的类型,以及比较该类型的两个对象的方法。

由于countGreaterThan方法使用了compareTo方法,因此需要提供给方法的参数是那些实现Comparable接口的类型。

当声明有界类型参数时,您告诉编译器T是实现Comparable接口的类型。因此,对类型为T的对象调用compareTo方法是安全的。因此将有界类型声明为&gt;允许您对类型T的对象调用compareTo方法。现在,编译器将允许您对泛型类型的对象调用compareTo方法。不仅如此,编译器还将强制提供给方法countGreaterThan的参数类型实现Comparable接口。

答案 6 :(得分:0)

T表示任何类型。所以如果你有方法

public static int countGreaterThan(T[] anArray, T elem)

这意味着您可以像这样调用它:

public static int countGreaterThan(String[] anArray, String elem)

或与任何其他类。你在这里唯一的限制是由T表示的两个类都是相同的。

&gt;意味着,T需要是Comparable的子类。所以T需要实现Comparable。一个例子是Integer,它实现了Comparable。这意味着,Integer的方法是Integer.compareTo(Integer i)。

&gt;如果要使用由该接口定义的某些方法,则约束可能很有用。对于你的方法countGreaterThan():这个需要使用.compareTo()来确定输入对象是否大于另一个输入对象,因此每个输入对象都需要有.compareTo()方法。所以你宣布&gt;现在你可以使用.compareTo()。

答案 7 :(得分:0)

由于这是一个静态函数,因此有关T的信息必须伴随它。例如,方法T已经被定义/约束。 即:

class Example<T extends Comparable<T>> {
    public void doSomethingWithT(T param) { ... };
}