繁体   English   中英

Java泛型方法结构说明

[英]Java Generics method structure explanation

我试图学习java泛型,从这里我得到了下面的方法定义,可以有人解释为什么我们在返回类型之前声明<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>

这仅表示通用类型T必须扩展Comparable<T> 通过告诉编译器,您的T对象将可以使用Comparable<T>所有公共方法。

Comparable<T>是一个接口,其协定表示“我们可以将此对象与T类型之一进行比较”。 如果对象本身的类型为T,则该对象与其自身具有可比性。 这是我们在这里想要的行为。 类似的行为的例子是Integer ,它实现Comparable<Integer>

在此,此方法要求您传入与自己可比较的对象。

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

该方法需要一个项目数组和一个项目,并且从名称来看,我猜想它将返回anArray中“大于” elem

这将适用于具有明确的“大于”关系的任何类型T ,即,任何与自身Comparable类型,正是<T extends Comparable<T>>表示的形式-任何类型T ,只要该类型是将目标类型本身作为其类型参数的Comparable的实现。

能够访问: compareTo(T o); 我们必须扩展Comparable接口

为什么,因为只有在执行此操作后,我们才能访问它,因为它事先无法使用。

在此处输入图片说明

Wikipedia上有一篇关于Java泛型的出色文章

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

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

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

当您声明一个有界的类型参数时,您将告诉编译器T是实现Comparable接口的类型。 因此,在类型T的对象上调用compareTo方法是安全的。因此,将有界类型声明为>可使您在类型T的对象上调用compareTo方法。现在,编译器将让您在对象上调用compareTo方法。通用类型。 不仅如此,编译器还将强制要求提供给方法countGreaterThan的参数类型实现Comparable接口。

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

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

这意味着您可以这样称呼它:

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

或任何其他班级。 您在这里的唯一约束是T表示的两个类是相同的。

>表示T必须是Comparable的子类。 因此,T需要实现可比性。 一个示例是Integer,它实现Comparable。 这意味着,Integer具有方法Integer.compareTo(Integer i)。

如果要使用该接口定义的某些方法,>约束可能很有用。 对于您的方法countGreaterThan():此方法需要使用.compareTo()来确定一个输入对象是否大于另一个对象,因此每个输入对象都需要具有.compareTo()方法。 因此,您声明>,现在可以使用.compareTo()。

由于这是静态函数,因此必须附带有关T的信息。 对于实例方法,T将已经被定义/约束。 即:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM