12

来自 Effective Java 第 5 章(泛型):

// Two possible declarations for the swap method
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);

这两个声明中哪一个更可取,为什么?在公共 API 中,第二个更好,因为它更简单。你传入一个列表——任何列表——并且该方法交换索引元素。无需担心类型参数。通常,如果类型参数在方法声明中只出现一次,请将其替换为通配符。

我不明白,为什么第二个选项对我的 API 客户端更简单?我可以将相同的参数传递给第一种和第二种方法。第二个还需要用于通配符捕获的辅助方法。有人可以解释为什么推荐第二个吗?谢谢!

4

1 回答 1

11

Java 泛型常见问题解答是回答这类问题的一个很好的来源,“通配符与泛型”问题在哪个更好:具有类型参数的泛型方法还是具有通配符的非泛型方法?以及随后的案例研究。

Angelika Langer 得出结论:

结论:在所有这些示例中,您更喜欢通用版本还是通配符版本主要取决于品味和风格。通常在易于实现(通用版本通常更容易实现)和签名的复杂性(通配符版本具有更少的类型参数或根本没有)之间进行权衡。

更简单的方法签名 -> 更容易理解(即使两者的使用方式相同) -> 在公共 API 中表现出色(权衡:更复杂的实现)

但整个事情都是一个轻量级的问题,根据我的经验,整个 API 的一致性比你使用哪种风格更重要。

于 2013-08-09T07:41:31.620 回答