适用泛型-如何规范add的数据类型

来源:2-6 使用泛型

qq_爱Zz真是太好了_0

2021-12-13

老师好
老师当我使用泛型之后,我发现有一个问题是我们并不能规范用户在插入元素时元素的类型。
例如我下面的代码,我希望用户输入的都是student类型,但是如果用户输入了一个整型1,函数不会发现问题,会允许用户输入,老师这一种情况有什么优化可以控制么

	students := array.New(20)
	students.AddLast(student.New("xiaoming",99))
	students.AddLast(student.New("xiaohong",100))
	students.AddLast(1)
	fmt.Println(students.String())
/**输出:
array: size= 3, capacity= 20
[{xiaoming 99},{xiaohong 100},1]
*/

期待老师的回复~

写回答

1回答

liuyubobobo

2021-12-14

说明你是用的不是 Java 语言(或者 C++ 语言,或者任何静态类型语言。)


动态类型语言的优点恰恰就是不需要写复杂的泛型约束逻辑,就可以让函数或者类可以支持任何类型,不需要写什么接口,父类,抽象类,就直接支持了很复杂的可复用的范式,以进行复用。所以动态类型语言简单,便捷,开发迅速;而其缺点恰恰就是你说的:约束不强,导致过于灵活,当程序规模达到一定程度,容易出错误,且调试困难。(而灵活本身,也是他们的优点。)


你现在提的问题,相当于是想让一个动态类型语言,拥有静态类型语言的特性,如果你真的有这个需求,说明你现在写的程序,不适合用动态语言完成,最直接的方案应该是:使用静态语言去完成。这就是为什么有那么多不同的编程语言的原因(之一)。


当然,不排除不同的语言,针对这个问题有一定的解决方案,比如最简单的方案是做类型检查,手动对用户传来的其他类型做异常处理。但这些都是治标不治本的。(相较 Java 或者 C++,在编译层面,就直接能够检查到这种类型错误。)我不是所有语言的专家,不同语言设计下最“适当”的实现或者封装某个算法或者数据结构的方式也不是这个课程的重点(实际上,这个课程中描述的 Java 实现也并非最标准,最严谨的封装方式。)


实际上,静态语言也是同理。泛型机制本身就是静态语言针对多类型问题提出的解决方案,但是如果你深入使用过 Java 或者 C++,深入使用过泛型机制,就会明白泛型有多么的难使用,多么的容易出现各种问题。以至于以 C++ 为例,是否有过大型项目的模板编程经验,是否精通模板编程,是精通 C++ 的重要标志之一。


继续加油!:)

0
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程