Java泛型-可比较接口

Java泛型-可比较接口,java,generics,comparable,Java,Generics,Comparable,在下面的代码中,Comparable接口用于确保x和y应为相同的参考类型,但由于V扩展了T,所以V应为T的相同类型或T的子类,那么使用Comparable接口的意义何在。 另外,如果我没有使用Comparable接口,那么最后一次调用isIf方法是编译,尽管x和y的类型不同。 有人能解释一下关于这个程序的使用可比界面吗 public class Generics_13 { static <T extends Comparable<T>, V extends T>

在下面的代码中,
Comparable
接口用于确保x和y应为相同的参考类型,但由于V扩展了T,所以V应为T的相同类型或T的子类,那么使用
Comparable
接口的意义何在。 另外,如果我没有使用
Comparable
接口,那么最后一次调用
isIf
方法是编译,尽管x和y的类型不同。 有人能解释一下关于这个程序的使用
可比
界面吗

public class Generics_13 {

    static <T extends Comparable<T>, V extends T> boolean isIn(T x, V[] y) {
        for(int i = 0;i < y.length;i++) 
            if(x.equals(y[i])) return true;

        return false;
    }

    public static void main(String[] args) {
        Integer nums[] = {10, 20, 30};

        if(isIn(10, nums))
            System.out.println("10 belongs to the array");
        if(!isIn(60, nums))
            System.out.println("70 doesnt belong to the array");

        String arr[] = {"Neeraj", "Parth", "Ritum"};
        if(!isIn("abc", arr))
            System.out.println("abc doesnt belongs to the array");

        /*if(isIn("String", nums))      //  illegal
            System.out.println("This wont compile");
        */
    }
}
公共类泛型\u 13{
静态布尔isIn(tx,V[]y){
对于(int i=0;i
当前泛型的使用没有真正意义,因为从来没有使用过来自
Comparable
的方法,这意味着您可以简单地删除
extends
声明

此外,也不使用类型
V
,因为您只需将其替换为
T
,而不会破坏您的逻辑。因此,最终结果如下所示:

public class Generics_13 {
    static <T> boolean isIn(T x, T[] y) {
        for(int i = 0;i < y.length;i++) 
           if(x.equals(y[i])) return true;

        return false;
    }

    // main() etc follow here
}

在您的场景中,此处的可比较项是可选的

T extends Comparable<T>
T
这意味着无论传递什么值,都应该实现接口。 这基本上意味着类型参数可以与相同类型的其他实例进行比较

现在您可能想知道,既然您传递的是基本数据类型,那么代码如何不抛出错误呢? 这是因为原语是自动装箱到包装器对象的,包装器对象实现了可比性。 因此,整数变成整数,字符串已经是一个对象,这两个对象都实现了可比性


PS:如果类实现了comparable

对象,那么您的代码也可以用于对象。equals
不需要comparable
那么为什么呢?您想用
T
做什么?另外,您也可以使用。按照惯例,将括号放在数据类型后面,而不是变量名后面。我知道这个程序中发生了自动装箱。我想知道的是,当V在这里扩展T时,y应该与T或T的子类具有相同的数据类型,但在最后一次调用isIn方法时,我没有发现任何错误,其中y是整数类型,x是字符串类型。在您的示例中,它们都是字符串。如果(!isIn(“abc”,arr)),您指的是正确的吗?不,我指的是我作为注释编写的最后一个if结构。您确定没有收到任何错误吗?这是极不可能的。如果我没有使用类似的接口,那么我就不会得到任何错误。我正在阅读一本Java书籍,我被困在这个程序中。谢谢你的回答。
T extends Comparable<T>