了解java集合类中泛型的使用
在研究Java的集合类(OpenJDK 8_update40)之后,我发现了以下方法:了解java集合类中泛型的使用,java,generics,collections,types,Java,Generics,Collections,Types,在研究Java的集合类(OpenJDK 8_update40)之后,我发现了以下方法: public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) { Iterator<? extends T> i = coll.iterator(); T candidate = i.next(); w
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
publicstatic因为如果不使用“T”,集合将只接受对象的实例
例如,字符串是对象的子类型,但不会编译,因为集合只接受对象实例。这是出于向后兼容的原因
当使用泛型类型且此泛型类型具有下限时,例如:
<T extends Foo & Bar> void someMethod(T xxx)
(好吧,参数名称不在那里,但你可以理解)
现在,Collections.max()
是在JDK5之前定义的;其签名为:
public static Object max(Collection coll)
在Java 5中,可以将其翻译为:
public static Object max(Collection<Object> coll)
publicstaticobjectmax(Collection coll)
问题是max
的返回值不能是可比的
当然,在这种情况下,增加了更多的困难:
- 第二个下限是它本身是一个泛型类型李>
- 此外,
Comparable
是PECS方式的“消费者”(因此,Comparable这是由于
一般来说:
- 如果泛型类型T用于返回值,那么您可以使用
为什么对象绑定-简短答案-向后兼容性。不用担心,您不需要关心。我知道泛型用于什么,但这并不能回答我的问题。我的观点是,我相信op的问题更多的是关于“为什么对象”;但关于你所描述的,这几乎是PEC。对吗?我想我误解了这个问题。是的,这就是我所描述的。虽然向后兼容性问题是OP的问题所在,但我试着想象一个场景需要所有这些扩展
和超级
子句,但我找不到。它需要一个显式类型参数,既不匹配实际的可比较的
实现,也不匹配集合的类型
,以利用这些可能性。但是没有可以想象的理由插入这样一个显式类型参数。因此,至少在中扩展了
Collection@Holger不知道你在说什么ean在此;此方法确实要求将类型参数定义为返回类型。您可以详细说明吗?您始终可以推断T
的最具体类型,即集合的元素类型,并使用该类型作为方法的返回类型。它仍然可以分配给T
的每个超类型。这就是Collect>的原因ion
就足够了,扩展返回元素的类型始终是可能的。顺便说一句,当编译器推断出T
时,这种情况总是会发生。这就是为什么我说的,您需要插入一个显式类型见证,而不是与集合的元素类型匹配,以利用当前的灵活性。但是,对于t、 …
public static Object max(Collection<Object> coll)