给出以下类Foo
:
class Foo<T extends Bar> {
T child;
Foo(T t) { child = t; }
}
除了一个区别,我不明白为什么我应该使用此类而不是使用像这样的具体类型的类:
class Foo {
Bar child;
Foo(Bar bar) { child = bar; }
}
我看到的上述区别是,对于通用类,我可以直接使用子类型的接口(例如,如果要使用SubBar
作为类型参数实例化类模板,则可以使用SubBar
的接口) 。),而对于具体类型,我将不得不进行类型检查。还有其他原因可以使用我没有看到的通用版本吗?
答案 0 :(得分:1)
当然界限不一定总是必要的。尤其是当您仅需要超类时。但是,请想象实现像Bubblesort这样的排序算法,并且该算法应该处理实现Comparable
接口的所有对象。检索订购的同类产品是否足够?
我会选择“否”。例如,如果您输入一些Integer,则期望返回一个有序的Integer列表,而不是一个Comparables列表。
示例:
public final class ListBubbleSort<E extends Comparable<E>>
{
public List<E> sort(List<? extends E> list)
{
// do sort...
}
}
无限制地,返回的列表只能包含可比较对象,然后您必须将可比较对象转换为自己,以便再次将它们用作整数。如果不小心,可能会导致ClassCastException
。在限定范围内,在编译时对“ casting”进行了“检查”,因此这种例外情况将不太可能。