我正在编写函数式静态助手方法,作为通用抽象的运算符(比如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)
答案 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)
没有缩小的签名。