本节课的三个小问题
来源:4-5 案例:使用 Retrofit 发送网络请求

慕莱坞0998854
2022-12-03
1> 关于序列化的问题。在js里面我理解的序列化就是把json格式的字符串转化为对象,或者反过来,这个就是一个简单的JSON.Stringify和JSON.parse而已,为什么在Kotlin里面还需要安装额外的包呢(如本节的gson).而且在kotlin的代码里面还有什么@SerialName之类的,这个很不能理解为什么kotlin这么麻烦。是否js里面的JSON.parse出来的结果只是一个对象,但是这个对象是什么类型,是没法判断的?老师能否解释下kotlin里面的序列化和ts/js里面的差异?以及为什么kotlin这么麻烦的必要性?
2>视频里面的代码如下:
val gitHubApi =
Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
// create的参数为 一个java的类
.create(GitHubApi::class.java)
老师说,create的参数是一个java的类,在ts里面,类的类型
// ts
type ClassRef = new (...args: any[]) => any;
现在知道了ts里面的类就是一个函数,可是java里面的类是啥呢?有点看不见摸不着,GitHubApi是一个Interface,而GithubApi::class就是一个类了呢?这个GithubApi::class在哪呢?
3> 老师在对比Kotlin和Java的代码的时候,说Kotlin的扩展方法有readText,而java没有所以写起来很费劲,这里是说kotlin里面内置了这个readText这个方法,而java里面没有原生支持这个方法吗?那假如有人安装了一个java包,java包里有这么一个扩展方法,那么在这个例子中,java不就和Kotlin一样了吗
1回答
-
bennyhuo
2022-12-04
首先,JSON 本身就是 JavaScript 的语法,JSON 是 JavaScript Object Notation 的缩写,所处 Js 当中内置对 JSON 的处理函数是很正常的。除了 JS 之外,很少有语言在标准库当中就提供 JSON 的解析支持。其次,Js 和 Kotlin 的类型系统差异太大,对于静态强类型的语言来说,序列化和反序列化其实不会可以针对某种特定的协议,例如除了常用的 JSON 以外,还有比较常用的 ProtoBuf 等等,这些其实本质上都是想通的,把二进制或者文本反序列化成类型实例的时候需要与类型定义强关联,是一个很复杂的过程,而 Js 根本不需要关心反序列化之后是什么类型。
GitHubApi::class 是 Kotlin 当中的写法,你在 Java 当中会看到 GitHubApi.class,本质上就是 KClass 和 Class 类的实例。他们是确实存在的,运行时还可以用他们来反射类信息。
Java 不支持扩展方法的语法。所以 Java 代码当中一般会有一堆 Utils 类,定义一堆静态方法。
022022-12-04
相似问题