在解释的情况下如何在java中使用泛型类型声明?

时间:2016-06-27 23:59:48

标签: java generics types

我很难理解使用泛型类型参数的最佳方法。

考虑实现接口的优先级队列实现,并要求所有元素都与其类型相当。该类有一个带有输入类型集合的构造函数,它提供了初始元素。以下是一些替代方案。你能解释一下差异吗?并提供这种声明的最一般方式?

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) {
     ...
     }
}

1 个答案:

答案 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的文章。