[英]Generic <T extends Comparable<T>, V extends T> is V required
在 Java Complete Reference 中的泛型方法下遇到了这个例子。
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;
}
这里V extends T
令人困惑。 我们能否只让<T extends Comparable<T>>
来完成工作。 因为 T 扩展了一些类型,这意味着类型及其子类型。 那为什么我们需要 V 扩展 T?。 使用<T extends Comparable<T>, V extends T>
有什么特殊情况吗?
是的,在这种情况下,由于V
仅在一个地方使用,在V[]
参数类型中,并且由于数组类型是协变的,因此V
是不必要的,并且可以使用此签名编写该方法:
static <T extends Comparable<T>> boolean isIn(T x, T[] y)
这两个方法签名将接受相同的参数集(假设调用者没有指定显式类型签名。您可以看到如下:
V[]
传递给第一个签名的参数都可以作为T[]
传递给第二个签名,因为V extends T
,所以V[] extends T[]
(Java 中的数组类型是协变的)。T[]
传递给第二个签名的参数都可以作为V[]
传递给第一个签名,因为编译器总是可以将V
推断为T
,因为T
在V
的范围内。 这样的推断不会在其他任何地方引起问题,因为V
没有在其他任何地方使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.