你能解释一下这段代码的C#代码?
从Kotlin文档页面:
// public final class Gson { // ... // public <T> T fromJson(JsonElement json, // Class<T> classOfT) // throws JsonSyntaxException { // ...
在上面的代码片断中,我了解除Class<T>
之外的所有内容。 我认为这是C#相当于以下内容:
public sealed class Gson { public T FromJson<T>(JsonElement json, System.Type Type) { } }
客户端代码会这样说:
var gson = new Gson(); var customer = gson.FromJson<Customer>(json, typeof(Customer));
但我不能确定,因为整个System.Type
参数在方法定义中的泛型类型参数T
面前似乎是多余的。
另外,在该页面上的相同位置,在下面的代码段中, class.java
是什么?
inline fun <reified T: Any> Gson.fromJson(json): T = this.fromJson(json, T::class.java)
我假设Java中的Class
与System.Type
类似,所以如果你想说typeof(Customer)
,你会说Customer.class
? 那是对的吗?
什么是class.java
?
Java具有泛型类型的擦除 :实际类型T
在运行时不可用于代码。 由于Gson需要知道目标反序列化类型是什么,传递Class<T>
明确地标识它。
另一方面,Kotlin比Java有更强大的类型系统,并且由于内联函数,编译器知道泛型实际是什么(被指定的关键字)。 构造T::class.java
告诉Kotlin编译器确定适当的类型T
是什么,然后将类引用内联到T
。
这种内联重定义本质上是Kotlin的语法糖,允许Kotlin用户将目标类型的硬编码规范委托给编译器的推理。