语义上表示泛型

Posted

技术标签:

【中文标题】语义上表示泛型【英文标题】:semantically represent generics 【发布时间】:2013-03-28 13:22:48 【问题描述】:

我试图以语义的方式理解泛型。例如,当我读到人们将抽象类称为可以设置策略的结构时,抽象类似乎对我来说就位。当我读到人们将它们称为协作合同时,界面就被抢购一空。

考虑泛型有哪些好的方法可以帮助我将它们与其他 OO 结构区分开来并编写更智能的 API?

【问题讨论】:

将它们视为类型模板。 【参考方案1】:

您可以将它们视为对象类型的包装器。您正在创建的函数将为实例化的任何类型的对象执行某些操作,因此它就像一个模板,将为多种类型的对象执行相同的工作。

微软对泛型的介绍可能也有一些很好的描述

http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

【讨论】:

【参考方案2】:

将泛型类视为制作其他类的模板(类似地,泛型函数是制作其他功能的模板)。类型参数充当模板中的开口:通过将具体类型插入其中,您可以将泛型类或泛型函数变成真正的类或函数。类型参数“穿透”模板中的指定孔,产生完整的定义。

【讨论】:

这很有趣。如果我理解正确,就好像您正在标记您的方法/类签名摘要的部分......由调用者定义。温暖?还是更冷? @user1902664 正确,您保留部分类未完成,直到用户提供缺少的类型信息。 接受这个答案对我最有帮助的是让我的大脑以不同的方式思考它们。谢谢。【参考方案3】:

您似乎想从自上而下的角度来理解您的理解。定性意义上的“它是什么”,然后从那里得出真正的含义。简单地了解这些不同的构造做什么而不是尝试提出标签不是更容易吗?即从自下而上的角度处理它,并根据您现在已经直接理解的内容推断出您自己的定性描述。

抽象类需要你实现一个属性或方法,并且不能被实例化。它与接口有什么区别?它需要子类来选择你的作为它唯一的基类。接口没有这样的限制,但需要您在实现中定义其整个行为,而不是依赖于要在基类中定义的某些行为。

同样,泛型允许您将类型作为变量引入,可由调用者指定。它的实用性与一般的方法参数类似,只是提升到了更高的水平。换句话说,方法参数允许您根据调用者指定的某些输入来改变实现。通用参数允许您根据调用者指定的某些(其他)输入(即类型)来改变实现。

当然,为什么List<T>ArrayList 更有用是很清楚的。我不太确定为什么隐喻真的有助于理解原因。

【讨论】:

我非常感谢您的努力,真的。但我不得不大声笑......我完成了一半,所有的细节都在我的脑海中变成了gobbledygook。我个人很难从零件中找出孔(我妻子没有)。如果我能得到一个格式塔……然后突然间,这些部分开始就位了。我见过很多 List 与 ArrayList 的例子,但我最终将泛型视为容器,这是有限的。不过,您与参数的比较会有所帮助。谢谢。 @user1902664,但是你明白为什么List<T> 作为这些类的消费者 优于ArrayList 吗?如果是这样,那么您可以尝试自己实现其中一个类(或类似的类),这是一个简单的步骤。一旦你这样做了,我保证它会伴随着理解而来。 是的。作为 List 和 ArrayList 的消费者,我完全理解其优越性。实际上,尝试实现一个是我问这个问题的原因......因为我不确定我是否掌握了原因,因此不确定我是否正确使用它。即,也许一个接口可以很好地满足我的目的……或者一个泛型真的很有用。在我掌握之前我不能说。

以上是关于语义上表示泛型的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

Java 泛型泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

Kotlin学习手记--泛型泛型约束泛型型变星投影泛型擦除内联特化

java泛型泛型的内部原理:类型擦除以及类型擦除带来的问题

C#高级语法之泛型泛型约束,类型安全逆变和协变(思想原理)

Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )