繁体   English   中英

Java Generics - 可比较的界面

[英]Java Generics - Comparable interface

在下面的代码中, Comparable接口用于确保x和y应该具有相同的引用类型,但是当V扩展为T时,V应该与T的类型或T的子类相同,那么使用Comparable接口的重点是什么。 此外,如果我不使用Comparable接口,那么最后一次调用isIf方法isIf编译,尽管x和y的类型不同。 任何人都可以解释使用这个程序的Comparable接口吗?

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");
        */
    }
}

当前使用泛型并不是真的有意义,因为没有使用过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
}

但是现在我们在java-8有了Stream API ,你可以使用下面的代码片段来实现同样的目的:

static <T> boolean isIn(T x, T[] y) {
    return Arrays.stream(y).anyMatch(i -> i.equals(x));
}

您的方案中可比较的是可选的。

T extends Comparable<T>

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

现在您可能想知道,因为您正在传递原始数据类型,那么代码如何不会抛出错误? 这样做的原因是原语被自动装箱到实现Comparable的包装器对象。 所以你的int成为Integer,String已经是一个实现Comparable的对象。

PS:您的代码也适用于对象,只要该类实现了可比性

暂无
暂无

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

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