我试图学习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>
?
答案 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。
为什么,因为只有当我们这样做时才能访问它,因为事先并不可用。
维基百科有一篇关于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) { ... };
}