Java:误解泛型和通配符
Java: misunderstanding generics and wildcards
考虑以下代码:
public final class Algorithm {
public static <T extends Comparable<? super T>>
T max(List<? extends T> list, int begin, int end)
{
// ...
}
}
List<? extends T> list
参数声明是否等于List<? extends Comparable<? super T>> list
?
略有不同。
List<? extends T>
表示
a List
of objects of an unknown type that is either T
or a subclsss of T
List<? extends Comparable<? super T>>
表示
a List
of objects of an unknown type that is either Comparable<? super T>
or an implementation of Comparable<? super T>
.
让我们考虑这个 class 层次结构:A
和 B
是不相关的 class,它们都实现 Comparable<A>
并且都是最终的。是的,我知道这种情况是人为的。
如果从return值推断T
为A
,则只能将List<A>
传递给[=11=类型的参数].但是,您可以将 List<A>
和 List<B>
传递给 List<? extends Comparable<? super T>>
.
类型的参数
这里有一个例子可以证明我的观点:
public static void main(String[] args) {
List<A> aList = Collections.singletonList(new A());
List<B> bList = Collections.singletonList(new B());
A a = f(aList);
A b = f(bList); // doesn't compile
A c = g(bList);
A d = g(bList);
}
public static <T extends Comparable<? super T>> T f(List<? extends T> list) {
return null;
}
public static <T extends Comparable<? super T>> T g(List<? extends Comparable<? super T>> list) {
return null;
}
final class A implements Comparable<A> {
@Override
public int compareTo(A o) {
return 0;
}
}
final class B implements Comparable<A> {
@Override
public int compareTo(A o) {
return 0;
}
}
虽然在现实中,很少有像class B implements Comparable<A>
这样的事情发生,所以大部分,这两种类型问题是一样的。
考虑以下代码:
public final class Algorithm {
public static <T extends Comparable<? super T>>
T max(List<? extends T> list, int begin, int end)
{
// ...
}
}
List<? extends T> list
参数声明是否等于List<? extends Comparable<? super T>> list
?
略有不同。
List<? extends T>
表示
a
List
of objects of an unknown type that is eitherT
or a subclsss ofT
List<? extends Comparable<? super T>>
表示
a
List
of objects of an unknown type that is eitherComparable<? super T>
or an implementation ofComparable<? super T>
.
让我们考虑这个 class 层次结构:A
和 B
是不相关的 class,它们都实现 Comparable<A>
并且都是最终的。是的,我知道这种情况是人为的。
如果从return值推断T
为A
,则只能将List<A>
传递给[=11=类型的参数].但是,您可以将 List<A>
和 List<B>
传递给 List<? extends Comparable<? super T>>
.
这里有一个例子可以证明我的观点:
public static void main(String[] args) {
List<A> aList = Collections.singletonList(new A());
List<B> bList = Collections.singletonList(new B());
A a = f(aList);
A b = f(bList); // doesn't compile
A c = g(bList);
A d = g(bList);
}
public static <T extends Comparable<? super T>> T f(List<? extends T> list) {
return null;
}
public static <T extends Comparable<? super T>> T g(List<? extends Comparable<? super T>> list) {
return null;
}
final class A implements Comparable<A> {
@Override
public int compareTo(A o) {
return 0;
}
}
final class B implements Comparable<A> {
@Override
public int compareTo(A o) {
return 0;
}
}
虽然在现实中,很少有像class B implements Comparable<A>
这样的事情发生,所以大部分,这两种类型问题是一样的。