我正在编写函数式静态辅助方法,充当通用抽象的运算符(例如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)