Wat*_* v2 5 c# java generics type-erasure kotlin
从Kotlin文档页面:
// public final class Gson {
// ...
// public <T> T fromJson(JsonElement json,
// Class<T> classOfT)
// throws JsonSyntaxException {
// ...
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我了解除了那Class<T>件事之外的所有事情.我假设它是以下的C#等价物:
public sealed class Gson
{
public T FromJson<T>(JsonElement json,
System.Type Type)
{
}
}
Run Code Online (Sandbox Code Playgroud)
客户端代码会说:
var gson = new Gson();
var customer = gson.FromJson<Customer>(json, typeof(Customer));
Run Code Online (Sandbox Code Playgroud)
但我无法确定,因为在方法定义中System.Type泛型类型参数面前,整个参数似乎是多余的T.
此外,在该页面上的相同位置,class.java以下代码段中的内容是什么?
inline fun <reified T: Any> Gson.fromJson(json):
T = this.fromJson(json, T::class.java)
Run Code Online (Sandbox Code Playgroud)
我假设ClassJava 中的类与System.Type你说的类似,如果你想说typeof(Customer),你会说Customer.class?那是对的吗?
什么class.java?
Java具有泛型类型擦除:实际类型T在运行时不可用于代码.由于Gson需要知道目标反序列化类型是什么,因此传递Class<T>明确标识它.
另一方面,Kotlin具有比Java更强大的类型系统,并且由于内联函数,编译器知道泛型类型实际上是什么(reified关键字).该构造T::class.java告诉Kotlin编译器确定适当的类型T是什么,然后内联类引用T.
这种内联重新定义本质上是Kotlin的语法糖,允许Kotlin用户将目标类型的硬编码规范委托给编译器的推理.
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |