当您只能使用具体类型时,为什么会有上限的通配符?

时间:2018-08-01 07:17:17

标签: java generics polymorphism

给出以下类Foo

class Foo<T extends Bar> {
    T child;
    Foo(T t) { child = t; }
}

除了一个区别,我不明白为什么我应该使用此类而不是使用像这样的具体类型的类:

class Foo {
    Bar child;
    Foo(Bar bar) { child = bar; }
}

我看到的上述区别是,对于通用类,我可以直接使用子类型的接口(例如,如果要使用SubBar作为类型参数实例化类模板,则可以使用SubBar的接口) 。),而对于具体类型,我将不得不进行类型检查。还有其他原因可以使用我没有看到的通用版本吗?

1 个答案:

答案 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”进行了“检查”,因此这种例外情况将不太可能。