假设我有一个班级
public static class A<T extends D> { ... }
以及包含两个类的类D
:B
和C
,例如
public static class D { ... }
public static class B extends D { ... }
public static class C extends D { ... }
现在,在某个地方让我们说我想要一个A
的数组,无论是B
种还是C
种。 (例如,将类D
中的函数应用于数组中的所有项。)
我是否应该再次约束类型?
换句话说:这些选项中哪一个是最合适的?
A<?>[] re;
A<? extends D>[] re;
哪一个是最佳做法?
答案 0 :(得分:2)
由于T
的上限为D
,A<?>
只是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()方法。