来自Kotlin documentation页面:
// 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
?
答案 0 :(得分:7)
Java具有泛型类型擦除:实际类型authenticatedEvent(authResult) {
var a = authResult.accessToken;
print(a);
}
在运行时不可用于代码。由于Gson需要知道目标反序列化类型是什么,因此传递JSObjectImpl
会明确标识它。
T
关键字)。构造Class<T>
告诉Kotlin编译器确定适当的类型reified
是什么,然后将类引用内联到T::class.java
。
这种内联重新定义本质上是Kotlin的语法糖,允许Kotlin用户将目标类型的硬编码规范委托给编译器的推断。