你能用C#代码来解释一下这段代码吗?

时间:2016-08-18 04:50:55

标签: java c# generics kotlin type-erasure

来自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中的类ClassSystem.Type类似,所以如果你想说typeof(Customer),你会说Customer.class?这是对的吗?

什么是class.java

1 个答案:

答案 0 :(得分:7)

Java具有泛型类型擦除:实际类型authenticatedEvent(authResult) { var a = authResult.accessToken; print(a); } 在运行时不可用于代码。由于Gson需要知道目标反序列化类型是什么,因此传递JSObjectImpl会明确标识它。

另一方面,Kotlin具有比Java更强大的类型系统,并且由于内联函数,编译器知道泛型类型实际上是什么(T关键字)。构造Class<T>告诉Kotlin编译器确定适当的类型reified是什么,然后将类引用内联到T::class.java

这种内联重新定义本质上是Kotlin的语法糖,允许Kotlin用户将目标类型的硬编码规范委托给编译器的推断。