[英]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.