我很难理解使用泛型类型参数的最佳方法。
考虑实现接口的优先级队列实现,并要求所有元素都与其类型相当。该类有一个带有输入类型集合的构造函数,它提供了初始元素。以下是一些替代方案。你能解释一下差异吗?并提供这种声明的最一般方式?
public class HeapMinPQ<E extends Comparable<E>> implements MinPQ<E> {
...
public HeapMinPQ( Collection<? extends Comparable<E>> source) {
...
}
}
public class HeapMinPQ<E extends Comparable<E>> implements MinPQ<E> {
...
public HeapMinPQ( Collection<? extends E> source) {
...
}
}
public class HeapMinPQ<E extends Comparable<? super E>> implements MinPQ<E> {
...
public HeapMinPQ( Collection<? extends Comparable<E>> source) {
...
}
}
答案 0 :(得分:1)
您的构造函数不应使用Collection<? extends E>
,而应使用Collection<E>
作为参数的类型。此外,您的示例不完整;它们没有显示如何使用参数。
在第一种情况下,source
包含保证为capture ? of Comparable<E>
类型的元素。基本类型可能与E
兼容,也可能不兼容。因此,从source
中提取元素并将其用于E
实例不一定安全。
在第二个中,source
包含保证为capture ? of E
类型的元素,这意味着基本类型与E
兼容。只要特定子类型无关紧要,它就可用于E
的实例。
第三,课堂时间很奇怪。它说E
与其超类型相当,对于类似的类型通常不是这样。它可能会让您感到心痛,并且无法保证capture ? of Comparable<E>
基本类型的source
能够与E
进行比较,或者与E
兼容。
通常,您不希望在E
类型的通用类型中混淆E
的捕获,但完整的详细信息很复杂。我建议Angelika Langer的优秀网站http://www.angelikalanger.com/,特别是http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html,以获取更多知识,以及有关Developerworks和Oracle Tutorials的文章。