在定义功能Java API时,通用通配符的正确用法是什么?

时间:2012-07-10 13:49:24

标签: java generics bounded-wildcard generic-method

我正在编写函数式静态助手方法,作为通用抽象的运算符(比如Iterable<T>),我对使用通配符的时候有点困惑。在以下情况下,哪些是最正确,最安全,最简单的方法签名,为什么?

  • 检查属性:

public static int size(Iterable<?> source)

VS

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

  • 转化:

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

VS

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

  • 结合:

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

VS

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

VS

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

1 个答案:

答案 0 :(得分: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 provides其中许多方法;如果您愿意,可以将其作为参考。披露:我为Guava做贡献。)