3

我正在编写函数式静态辅助方法,充当通用抽象的运算符(例如Iterable<T>),我对何时应该使用通配符感到有些困惑。在以下情况下,正确、最安全和最简单的方法签名是什么,为什么?

  • 检查属性:

public static int size(Iterable<?> source)

对比

public static <T> int size(Iterable<T> source)

  • 转型:

public static <T> Iterable<T> take(Iterable<T> source, int count)

对比

public static <T> Iterable<T> take(Iterable<? extends T> source, int count)

  • 结合:

public static boolean elementsEqual(Iterable<?> first, Iterable<?> second)

对比

public static <T> boolean elementsEqual(Iterable<T> first, Iterable<T> second)

对比

public static <T> boolean elementsEqual(Iterable<? extends T> first, Iterable<? extends T> second)

4

1 回答 1

3
public static <T> int size(Iterable<T> source)

相当于

public static int size(Iterable<?> source)

只要你不需要T在方法实现中引用即可。我会犯错?,只是因为它减少了混乱。

public static <T> Iterable<T> take(Iterable<? extends T> source, int count)

是更通用的,它应该在两种情况下都有效,所以我会继续使用那个。

public static boolean elementsEqual(Iterable<?> first, Iterable<?> second)

是合适的,因为Object.equals(Object)没有狭窄的签名。

Guava 提供了许多这些方法;如果您愿意,可以将其用作参考。披露:我为 Guava 做出了贡献。)

于 2012-07-10T14:01:41.460 回答