多种语言中的泛型

目录
警告
本文最后更新于 2023-10-22,文中内容可能已过时。

多种语言中的泛型

分析

虽然 Java,JavaScript,Python 都支持面向对象,而且都支持泛型,但是之间的差别很大,主要原因在于 Java 是静态语言,而 JavaScript 和 Python 是动态语言

泛型一开始是静态语言提出的,因为静态语言的变量类型在编译期间必须确定,因此要写出一些兼容多种变量类型的代码,只能发明泛型

Java 的泛型检查,可以看 Java 核心技术卷一的《泛型程序设计》这一章

但是动态语言不一样。动态语言本身不需要泛型,因为动态语言在声明变量的时候不需要对类型进行明确限制,在调用方法的时候对传入的参数也没有明确的类型限定,换句话说,就是天生支持泛型的概念,因此,没有必要使用泛型,

Python 这样的动态语言的泛型只是为了让类型提示更加的准确(跟实际的变量的类型一致),方便 IDE 分析和和推断,方便实际执行前的排错,其实如果你不在乎这些,那泛型就是可有可无的,不使用泛型语法,代码也能跑。JS 也支持泛型,只需通过 jsdoc 的 @template 注解,TypeScript 也支持泛型,效果和作用跟 Python 类似。

Python 的泛型,主要场景是这个

https://blog.csdn.net/javasdn/article/details/130514021

https://blog.csdn.net/qq_35491275/article/details/124235543

JS 使用泛型的场景

https://juejin.cn/post/7095390120202731550

从这个问题,我们可以看到静态语言和动态语言在基因上的不同,除了泛型之外,还有一个例子,就是函数式编程

动态语言因为变量类型是动态的,所以同一个方法的同一个参数,在不做任何修改的情况下,你可以传入数字、字符串,自定义对象,也可以传入一个方法对象,不管方法内部怎么使用这个参数,至少在语言的编译器层面你是被允许这样传参的,因此动态语言支持函数式编程非常容易,在 JavaScript 里函数类型直接是一等公民。

但是 Java 这样的静态语言就很难,因为传入的函数也得有一个具体的类型才可以,如何设计呢?最后基于接口搞个 lamda 表达式,灵活性远没有动态语言的函数式编程那么大。

总结

因此,我们在进行技术选型的时候,需要考虑到不同的语言天生的基因优势,它天生适合干什么,我们就用它干什么。

从这个角度看,我觉得 TypeScript 很拧巴,其类型限定太强,JavaScript 本来就是动态语言,TypeScript 的这种强类型限定与 JavaScript 的基因是相反的,增加了开发过程中的负担。Python 就没人搞 TypePython,:joy_cat:

话说回来,其实我觉得 Java 才是最有技术含量的,虽然 Java 是静态类型,但是 Java 提供了泛型,一样能写出很精妙的接口设计,而且还更加安全。类似于,戴着镣铐起舞。

0%