为什么 Spinner class 不提供仿制药?

Why does the Spinner class not offer generics?

what-is-a-raw-type-and-why-shouldnt-we-use-it 中所述,使用原始 classes 是邪恶的。

现在,微调器 .getSelectedItem() return 是一个对象,它可以 return 正确的 class 如果它被初始化 Spinner<CorrectClass>.

为什么会这样?

getSelectedItem()AdapterView which return Adapter#getItem()的一个方法。 所以问题是"Why the interface Adapter is not generic ?".

答案很简单,因为 Android 小部件 AdapterView 可用于存储不同类型的对象。适配器的目的是提供这些对象的一致视图。

如果您向接口 Adapter(以及 AdapterViewSpinner)添加通用参数,则您正在修复基础数据集合的类型,这与整体背道而驰适配器 东西。

想法是适配器视图不需要知道适配器背后的底层数据,因此它不需要限制其数据类型。

然而,您可以在自己的 SpinnerAdapter 实现中使用特定类型(或通用参数)专门化 Adapter 接口,然后通过 Adapter 而不是 AdapterView 访问数据:

yourAdapter.getItem(spinner.getSelectedItemPosition()).