请用C#代码解释这段代码的含义。

5

来自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));

但我并不能确定,因为方法中的泛型类型参数 T 已经足以表达意思,System.Type 参数似乎有点多余。

另外,在同一页中的同一位置,下面这段代码中的 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 泛型类型在运行时不可用。如果方法需要知道泛型类型,您必须将它们作为参数传递。而 class.java 是一个有良好文档记录的 Kotlin 兼容构造。 - chrylis -cautiouslyoptimistic-
可能是什么是 Class 对象 (java.lang.Class)?的重复问题。 - Andreas Brunnet
1
@AndreasBrunnet 这不是一个相关的重复问题;这个问题是关于泛型擦除的。 - chrylis -cautiouslyoptimistic-
@chrylis 谢谢。这回答了我对 Class<T> 参数的需求问题。class.java 是什么意思?我已经更新了问题,加入了另一个 Kotlin 代码片段。 - Water Cooler v2
@chrylis那我应该忽略他的问题吗?class.java是什么? - Andreas Brunnet
@AndreasBrunnet,您所链接的问题仅确认了我的猜想,即Java中的Class类相当于CLR中的System.Type。它并没有回答整个问题。 - Water Cooler v2
1个回答

7
Java有泛型类型擦除:实际类型T在运行时代码不可用。由于Gson需要知道目标反序列化类型是什么,因此显式传递Class可以识别它。
另一方面,Kotlin比Java具有更强的类型系统,并且由于函数是内联的,编译器知道泛型类型实际上是什么(使用了关键字reified)。构造T::class.java告诉Kotlin编译器确定适当的类型T,然后将类引用内联到T中。
这种内联重新定义基本上是Kotlin的语法糖,允许Kotlin用户将目标类型的硬编码规范委托给编译器的推断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接