当类具有有界类型参数时,使用有界通配符

时间:2013-12-12 11:38:35

标签: java generics bounded-wildcard bounded-types

假设我有一个班级

public static class A<T extends D> { ... }

以及包含两个类的类DBC,例如

public static class D { ... }
public static class B extends D { ... }
public static class C extends D { ... }

现在,在某个地方让我们说我想要一个A的数组,无论是B种还是C种。 (例如,将类D中的函数应用于数组中的所有项。)

我是否应该再次约束类型

换句话说:这些选项中哪一个是最合适的?

  1. A<?>[] re;

  2. A<? extends D>[] re;

  3. 哪一个是最佳做法?

2 个答案:

答案 0 :(得分:2)

由于T的上限为DA<?>只是A<? extends D>的简写。它们都意味着相同的事情 - 就像T无限制一样,A<?>将是A<? extends Object>的缩写。

在这种语法方面,我不知道任何最佳做法;我认为这只是编码风格的问题。我更喜欢A<?>,因为它简洁,但A<? extends D>立即将上限传达给不熟悉A的开发人员。

答案 1 :(得分:1)

根据我的说法,你应该选择A<? extends D>[] re; 因此,用户不允许您仅添加扩展D类的对象 有界通配符在范围内提供有限的灵活性。

任何带有有界通配符的Type只能在bound内实例化,任何实例化都会导致编译错误。使用有界通配符的一个重要好处是它不仅限制Type的数量,作为参数传递给任何方法,它还提供对bound声明的方法的访问。例如,TreeMap(Comparator<? super K> comparator)允许访问Java中的Comparator的compare()方法。